Estoy tratando de hacer un sistema de tipo mientras uso QSharedData
. La idea es simple, habrá una cantidad de diferentes tipos de datos, cada uno de los cuales se derivará de la clase abstracta base. Quiero usar QSharedData
para almacenar los datos reales en cada uno de ellos, pero cada una de las clases derivadas tendrá datos diferentes almacenados dentro. Intento dar el ejemplo más básico ahora y tener algunos problemas.QSharedData y herencia
Digamos que estos son mis bases clases virtuales puras:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
Ahora digamos que yo quiero hacer una clase para representar un solo valor (como un ejemplo de que es minmalistic). Estoy derivar la cAtomicValue
de la clase valor base, y también estoy derivar una clase de datos para mantener el valor:
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; }
};
Ahora en esta etapa funciona muy bien, y en el depurador puedo ver la derecha tipo de puntero Pero ahora quiero agregar una función para establecer y obtener el valor, y no entiendo cómo hacerlo. Tomemos al colocador como un ejemplo. Para establecer el valor, debemos acceder al miembro value_
de la clase cAtomicData
a través del miembro data_
de la clase cAtomicValue
. Sin embargo, dado que el data_
contiene un puntero de clase base (cAbstractData
), tendré que convertirlo al tipo correcto (cAtomicData
) de alguna manera. He intentado hacer esto:
template<class T> void set(T value)
{
static_cast<cAtomicData*>(data_.data())->value_ = value;
}
es obvio que no funciona, ya que llama detach()
y trata de hacer una copia de la clase base que no puede ya que la clase base es pura virtual. Luego probé a emitir el propio puntero:
static_cast<cAtomicData*>(data_)->value_ = value;
pero estoy recibiendo un error invalid static_cast ...
.
¿Cómo lo hago, y lo estoy haciendo incluso de la forma correcta?
Gracias. Aparentemente no hay manera de verdad. Terminé usando 'QSharedPointer' en su lugar. – SingerOfTheFall