View Full Version : [C++] Si può fare?
Ikon O'Cluster
28-06-2009, 18:02
Avrei una classe template di questo tipo:
template <class Type> class SamplesBase;
Che è astratta. E ho due classi da questa derivate:
template <class Type>
class DelayBuffer : class SamplesBase<Type>;
template <class Type, class SummaryType>
class SHSummaryBuffer : class SamplesBase<Type>;
Queste classi nel costruttore hanno un parametro int (con valore default) che ne dimensiona alcuni membri. A questo punto ho:
class MiaClasse {
protected:
unsigned char dim_;
std::vector<SHSummaryBuffer<Tipo1, Tipo2>> history_
std::vector<DelayBuffer<Tipo1>> cbuffer_
//...
};
Volevo sapere come posso fare per far in modo che al momento della costruzione di MiaClasse, gli elementi di tipo DelayBuffer<Tipo1> e SHSummaryBuffer<Tipo1, Tipo2> vengano costruiti con un valore int da me specificato e non con il valore di default usato dal costruttore default.
Grazie
Puoi inserire nel vettore elementi che abbiano un valore intero diverso con push_back (ad esempio):
cbuffer_.push_back(DelayBuffer<Tipo1>(intero));
Ovviamente deve essere definito il costruttore di copia nel caso di memoria dinamica.
Ikon O'Cluster
28-06-2009, 18:18
Eh... mi scocciavo :p
Al limite c'è questa per inserire K elementi tutti uguali ;)
http://www.cplusplus.com/reference/stl/vector/insert/
Ikon O'Cluster
28-06-2009, 18:29
non male :D
Ikon O'Cluster
28-06-2009, 18:47
Alla distruzione di MiaClasse quei vector vengono puliti come si deve??? Non alloco niente dinamicamente, da nessuna parte...
Ikon O'Cluster
28-06-2009, 18:50
Uhm..... non è una bella risposta :eek:
Sì in questo caso sì, dipende anche un po' da come la usi...se non allochi niente dinamicamente non ci possono essere problemi.
Ikon O'Cluster
28-06-2009, 19:11
E guarda un po' qui...
std::vector<SamplesBase<Tipo1, Tipo2>> history_;
std::vector<SamplesBase<Tipo2, Tipo2>> cbuffer_;
void init() {
history_.insert(history_.begin(), N, SHSummaryBuffer<Tipo1, Tipo2>(M));
cbuffer_.insert(cbuffer_.begin(), N, DelayBuffer<Tipo2, Tipo2>(K));
}
Essendo le definizioni:
template <class Type, class SummaryType>
class SamplesBase;
template <class Type, class SummaryType>
class DelayBuffer : class SamplesBase<Type, SummaryType>;
template <class Type, class SummaryType>
class SHSummaryBuffer : class SamplesBase<Type, SummaryType>;
Dovrebbe andare tutto OK, nell'inizializzazione. Ma se si considera che:
virtual bool get(const SummaryType& t) const = 0;
E' una funzione di SamplesBase definita delle sottoclassi, quando faccio:
history_[i].get(obj1);
cbuffer_[j].get(obj2);
Va tutto OK??? Cioè mi chiama nel primo caso SHSummaryBuffer::get e nel secondo DelayBuffer::get? Non posso provare perchè sto ancora in fase troppo preliminare, ma se così non si può fare poi x cambiare perdo troppo tempo...
P.S.: get() è virtual anche nelle sottoclassi.
E perché non dovrebbe andare ?
Ikon O'Cluster
28-06-2009, 22:18
Sto modificando in continuazione... non funziona niente. Accidenti ai template... sono la cosa più orripilante che esista nella programmazione!
Mi spiego:
template <class Type>
class SamplesBase {
protected:
std::list<Type*> base_;
public:
SamplesBase(unsigned char dim = 0) {
base_.insert(base_.begin(), dim+1, (Type*)NULL);
}
};
template <class Type>
class DelayBuffer : public SamplesBase<Type> {
public:
DelayBuffer(unsigned char dim = 0) : SamplesBase(dim) {}
};
Ovviamente ho riportato solo la parte di implementazione che mi interessa. Mi sapete dire perchè:
In constructor ‘DelayBuffer<Type>::DelayBuffer(unsigned char)’:
error: class ‘DelayBuffer<Type>’ does not have any field named ‘SamplesBase’
????
Ikon O'Cluster
28-06-2009, 22:27
Ok mancava <Type>... :p :p :p Ditemi però perchè la funzione della classe DelayBuffer:
virtual const Type* get() const {
return base_.front();
}
Non compila così... dice che base_ non è dichiarato, ma se scrivo SamplesBase<Type>::base_ lo vede!!!
Ma questa get dove è dichiarata ?
Ikon O'Cluster
29-06-2009, 10:23
Da nessuna parte più... :doh: Ti accorgi che stai sbagliando tutto e che bisogna progettare a modo proprio quando per fare qualcosa di semplice cominci a romperti i maroni :D :D :D :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.