Sto provando a creare un sistema di tipi durante l'utilizzo di QSharedData
. L'idea è semplice, ci saranno diversi tipi di dati, ognuno dei quali sarà derivato dalla classe astratta di base. Voglio utilizzare QSharedData
per memorizzare i dati effettivi in ciascuno di essi, ma ciascuna delle classi derivate avrà dati diversi memorizzati all'interno. Sto cercando di fare l'esempio più semplice ora, e avendo qualche problema.QSharedData ed ereditarietà
Diciamo che queste sono le mie basi puri classi virtuali:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
Ora diciamo che voglio fare una classe per rappresentare un singolo valore (come ad esempio minmalistic che è). Sto derivare la cAtomicValue
dalla classe di valore di base, e sto anche derivare una classe di dati per contenere il valore:
class cAtomicData:public cAbstractData
{
public:
cAtomicData() { value_ = 0; }
int type(){ return 1; }
QVariant value_;//the actual value
};
class cAtomicValue:public cAbstractValue
{
public:
cAtomicValue() {
data_ = new cAtomicData;//creating the data object.
}
int type(){ return 1; }
};
Ora, in questa fase funziona bene, e nel debugger posso vedere il diritto tipo di puntatore. Ma ora voglio aggiungere una funzione per impostare e ottenere il valore, e non riesco a capire come farlo. Prendiamo il setter come esempio. Per impostare il valore, è necessario accedere al membro value_
della classe cAtomicData
tramite il membro data_
della classe cAtomicValue
. Tuttavia, poiché lo data_
contiene un puntatore di classe base (cAbstractData
), dovrò farlo in modo corretto (cAtomicData
) in qualche modo. Ho provato a fare questo:
template<class T> void set(T value)
{
static_cast<cAtomicData*>(data_.data())->value_ = value;
}
ovviamente non funziona, perché è chiamato detach()
e cerca di fare una copia della classe di base, che non è possibile in quanto la classe base è pura virtuale. Poi ho provato a lanciare il puntatore stesso:
static_cast<cAtomicData*>(data_)->value_ = value;
ma sto ottenendo un errore invalid static_cast ...
.
Come faccio, e lo sto facendo anche nel modo giusto?
Grazie. Apparentemente non c'è davvero alcun modo. Alla fine ho usato 'QSharedPointer'. – SingerOfTheFall