Я пытаюсь создать систему типов при использовании QSharedData
. Идея проста, будет существовать ряд разных типов данных, каждый из которых будет получен из базового абстрактного класса. Я хочу использовать QSharedData
для хранения фактических данных в каждом из них, но каждый из производных классов будет иметь разные данные, хранящиеся внутри. Сейчас я пытаюсь сделать самый простой пример и иметь некоторые проблемы.QSharedData и наследование
Допустим, это мои базовые чистые виртуальные классы:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
Теперь предположим, что я хочу сделать класс для представления одного значения (как minmalistic например, что есть). Я выведение 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 ...
.
Как мне это сделать, и я вообще делаю это правильно?
Спасибо. По-видимому, нет никакого способа. Вместо этого я использовал 'QSharedPointer'. – SingerOfTheFall