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; }
};
は今、この段階ではそれだけで正常に動作し、デバッガで私が右を見ることができますポインタ型。しかし、今では値を設定して取得するための関数を追加したいのですが、その方法を理解できません。例としてセッターを取りに行きましょう。値を設定するには、cAtomicValue
クラスのdata_
メンバーを通じてcAtomicData
クラスのメンバーvalue_
にアクセスする必要があります。しかし、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