2017-03-29 16 views
0

問題に関連する解決策を見つけるためにいくつかの問題があります。 私はクラスからいくつかのデータを返さなければなりません。データの種類はクラスに依存します。 私の最初のソリューションは、このでした:C++のコンテナ、共分散およびテンプレート

class Base 
{ 
    virtual QVector<Data*> getData() const = 0; 
}; 

class Derived : public Base 
{ 
    virtual QVector<DerviedData*> getData() const = 0; 
}; 

しかし、私はこれが原因で無効な共変戻り値の型の、DerivedDataはデータを拡張しても、不可能であることを知っています。

私はテンプレートを意味する別のアイデアを考え出しました。

template<class T> 
class Base 
{ 
    virtual QVector<T*> getData() const = 0; 
} 

そして、私はそのようなDerivedコンストラクタ書くことができます::

Derived::Derived() : Base<DerivedData>() {} 

をしかし、私は別の問題を抱えている知っている私がやったことは、私は、テンプレートクラスに基底クラスになっています。別のクラスを書くとします。このクラスには、パラメータにBaseクラスを持つメソッドがあります。

void Foo::doSomething(Base* b) { 
    b->getData(); 
} 

これは、コンパイルして、私は完全に理解して引数リスト

なしのテンプレート名「基本」が

無効な使用を述べていません。

私のコードは、そのようになりますと仮定すると:

DerivedClass1 d1; 
DerivedClass2 d2; 
DerivedClass3 d3; 

this->doSomething(&d1); 
this->doSomething(&d2); 
this->doSomething(&d3); 

私のソリューションはここ何ですか?メソッドdoSomethingの「テンプレート化」のようなことをしてもいいですか?

template<class T> 
void doSomething(Base<T>* b); 

ようprotoypeで

this->doSomething<DerivedData>(&d1); 

があることは可能ですか?それはいい考えですか?ジャワから来る は、私が使用してワイルドカード

abstract List<? extends Data> getData(); 

ことにより、このような問題を解決するために使用しかし、私はそこstricly(以上またはstd::is_base_ofようなものであまりsimulable)C++ではそのような事を話していないと聞きました。

ありがとうございます。

+1

_可能なことですか?_まあ..試しましたか? –

+1

'DerivedData'は' Data'から継承していますか?それは問題ではありません。 –

+0

@AlgirdasPreidžius:いいえ、私は試しませんでした。これは私にとって奇妙に感じられるので、私はそれがより良い解決策であるかどうかを知りたいと思っていましたが、試してみます。 –

答えて

0

Derived::getData(を返信するとQVector<Data*>となります。あなたがそれを使用する必要があるときは、QVectorのポインタがdynamic_castまたは同様の方法を使用してDataまたはDerivedDataにあるかどうかを調べます。

関連する問題