PDA

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

cionci
28-06-2009, 18:09
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

cionci
28-06-2009, 18:20
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...

cionci
28-06-2009, 18:48
Sì, dovrebbero.

Ikon O'Cluster
28-06-2009, 18:50
Uhm..... non è una bella risposta :eek:

cionci
28-06-2009, 18:53
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.

cionci
28-06-2009, 19:15
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!!!

cionci
29-06-2009, 09:14
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