2012-02-25 10 views
6

私はC++を使い慣れていません。残念ながらC#(私の以前の言語)で考えるのをやめることはできません。 私はいくつかの書籍、フォーラム、C++リファレンスWebサイトを読んでいましたが、私の質問に対する答えは見つからなかったので、醜いものをあきらめて書く前にここで試してみるかもしれないと思いました。C++の一般的な型のコレクションを返す正しい方法

よろしくお願いいたします。 私は抽象メソッドのクラスを持っていますsuccesorsFunctionと私はへのポインタのコレクションを返したいと思います。私は特定のコンテナに実装者を強制したくありません。私はむしろ彼らに選択させる(ベクトル、リストなど)。

だから、次のようになります。

class Problem 
{ 
public: 
    virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator result) const = 0; 
}; 

ここでの問題は、リストを明示的に使用することです。 C++でどうやってやっていますか?

私はテンプレートを使用して考えたが、その後私は2つの問題が発生しました:あなたは抽象メソッドでそれを行うことができない(または私は間違っているように思え) 1) 2)どのように私はそれがポインタを含まなければならないテンプレートを教えていますか?国家に?

+2

それを呼び出します。 – Xeo

+0

この機能とバーチャルが達成するはずのものを拡張できますか?代わりの方法があるかもしれません。 –

+2

'IEnumerable 'に類似したものを返そうと思っていますか? – svick

答えて

2

C++の戻り値の型に基づいてメソッドをオーバーロードすることはできません。

また、C++の「containers」は同じベース(JavaではCollectionなど)を持たないため、汎用コンテナを返すことはできません。

私は恐らくこれを行うきれいな方法がありません。

オーバーロード(パラメータ別)または異なる関数名を書きます。

1)できます。何ができないと思う?

2)listと同じ方法:list<const State*> - constはオプションです。

+4

戻り値でオーバーロードについて何も言わなかったと思います。戻り値の型が同じ複数の実装があります。彼は戻り値の型が実装を制限しない程度に一般的であることを望んでいます。 –

+0

@ ErnestFriedman-Hill彼の質問は、コレクションを返そうとしていて、コレクションを制限したくないということです(コードはイテレータを返します)。 –

+0

...戻り値の型によるオーバーロードについては何も言わない。 –

0

あなたは仮想であるメンバ関数テンプレートを持つことはできませんが、あなたはこのような友人の一般的な機能を実装してみてください:

:あなたはこのような vector<State> a引数を指定して、たとえば、あなたの関数を呼び出す場合

template <typename yourType> 
yourType& succesorsFunction(const State &a, yourType &result){//Your return type can be without reference 
    //Your body 
    return result; 
} 

sucessorsFunction(b,a);// b is your State object 

控除プロセスが自動的yourTypeは、実際に私はあなたの問題を解決すると思うvector<State>タイプ、であると結論します。また、このアーキテクチャでは、新しいクラス・タイプMyVector(配列はStates)を作成し、MyVectorオブジェクトをsuccesorsFunctionに渡すことができます。

+0

私はそれを試みましたが、抽象メソッドでは機能しませんでした。私は最後に= 0を取り除いて、それを取り除くかもしれない。あなたの返信をありがとう – wolfovercats

+0

@wolfovercatsタイプがわからない場合は、どのように結果を入力しますか? –

+0

@LuchianGrigore私はタイプを知っています。それは国家*です。 – wolfovercats

0

あなたが本当に次のことを試して、STLコンテナの使用を強制したい場合:

template <template <typename, 
        typename = std::allocator<const State *> > class Container> 
Container<const State*> successorsFunction(const State &state, const Container<const State*> &c) const 
{ 
    // return something useful. 
} 

あなたは、この機能は、仮想も持つことを主張した場合、それはただでそれをオーバーロード、メンバ関数テンプレートにはできませんあなたがサポートしようとしているタイプは、仮想化できます。

0

これは、ちょうどC.T'sの回答です。ポインターのコンテナを返す場合は、明示的に解放するか、std::unique_ptrを使用する必要があります。
あなたはC#のバックグラウンドの人です。

Stateを使用することも、それをテンプレート化することもできます。

template<typename Type, 
     template< typename, typename = std::allocator<Type*> > class Container 
     > 
Container<Type*> Successor(const Type& x) 
{ 
    Container<Type*> cont; 
    // something. 
    cont.push_back(new Type(x)); 
    return cont; 
} 

とBoost.Rangeの種類消去された範囲がここに助けるかもしれない

vector<State*> states = Successor<State, vector>(State(10)); 
関連する問題