Я пытаюсь создать систему типов при использовании QSharedData
. Идея проста, будет несколько разных типов данных, каждый из которых будет производным от базового абстрактного класса. Я хочу использовать QSharedData
для хранения фактических данных в каждом из них, но в каждом из производных классов будут храниться разные данные. Сейчас я пытаюсь сделать самый простой пример, и у меня есть некоторые проблемы.
Скажем, это мои базовые чистые виртуальные классы:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
Теперь предположим, что я хочу создать класс для представления одного значения (в качестве минималистического примера). Я получаю cAtomicValue
из класса базовых значений, а также получаю класс данных для хранения значения:
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; }
};
Сейчас на данном этапе все работает нормально, и в отладчике я вижу правильный тип указателя. Но теперь я хочу добавить функцию для установки и получения значения, и я не понимаю, как это сделать. Возьмем сеттер в качестве примера. Чтобы установить значение, мы должны получить доступ к члену value_
класса cAtomicData
через член data_
класса cAtomicValue
. Однако, поскольку data_
содержит указатель базового класса (cAbstractData
), мне придется каким-то образом привести его к нужному типу (cAtomicData
). Я пытался сделать это:
template<class T> void set( T value )
{
static_cast<cAtomicData*>(data_.data())->value_ = value;
}
это, очевидно, не работает, потому что он вызывает detach()
и пытается сделать копию базового класса, чего он не может, поскольку базовый класс является чисто виртуальным. Затем я попытался передать сам указатель:
static_cast<cAtomicData*>(data_)->value_ = value;
но я получаю ошибку invalid static_cast ...
.
Как мне это сделать, и правильно ли я вообще это делаю?