は、以下のクラスポリモーフィックオブジェクトのコレクションを所有するのに好ましいC++イディオムは何ですか?
class Base {
public:
virtual void do_stuff() = 0;
};
class Derived : public Base {
public
virtual void do_stuff() { std::cout << "I'm useful"; };
};
を考えてみましょう今度は、私はBase
年代派生型のオブジェクトを所有する責任別のクラスを持っているし、彼らのdo_stuff()
メソッドを呼び出して、それらを反復処理したいとしましょう。それはこのように見えますが、私はいくつかの可能性を参照してください
class Owner {
public:
void do_all_stuff() {
//iterate through all items and call do_stuff() on them
}
void add_item(T item) {
items.push_back(item);
}
vector<T> items;
}
として
T
が宣言されなければならないのか分からない。私は唯一のオブジェクトを追加することができるだろうので、
は
T
は、Base
することはできません具体的なタイプのBase
のように、それは問題外です。
T
はBase*
またはBase&
することができますが、今私は私にポインタまたは私はitems
からそれを取得する際にまだ存在するオブジェクトへの参照を渡すためにadd_item()
の呼び出し元を信頼する必要があります。私はのデストラクタの要素をdelete
にすることはできません。なぜなら、私はそれらが動的に割り当てられているのか分からないからです。しかし、それらがあれば、彼らはdelete
'dでなければなりません。それは私にあいまいな所有権を残します。
T
はBase*
またはBase&
することができ、私はOwner
にBase* create_item<DerivedT>() { return new DerivedT; }
メソッドを追加します。この方法では、私はポインタが有効なままと私はそれを所有していることを知っているが、私はDerivedT
で非デフォルトのコンストラクタを呼び出すことができません。また、Owner
は、オブジェクトのインスタンス化も担当します。 Owner
のデストラクタのすべての項目を削除する必要がありますが、これは大きな問題ではありません。
基本的に、私は次のように何かをできるようにしたいと思います:
Owner owner;
void add_one() {
Derived d;
owner.add_item(d);
}
void ready() {
owner.do_all_stuff();
}
void main() {
for(int i = 0; i < 10; ++i) {
add_one();
}
ready();
}
私はそこに意味を移動するために関連する何かがあると確信している(私はそれらを所有するadd_items()
に渡されたオブジェクトを移動することができます)しかし私はまだ私のコレクションが宣言される方法を把握することができません。
この種のポリモーフィックオーナーシップ(特にSTLコンテナ)のC++イディオムは何ですか?
多態性が必要な場合は、最終的に 'std :: container '、 "ambiguous"を実行するかどうかが決まります。メモリ管理が心配な方は、コンテナ>を作成することもできます。 –
あなたは多種多様な選択肢を持っていません。あなたは、(a)生ポインタ(b)スマートポインタのコレクションを持つことができます。それはそれです。理論では、(a)は、(a.1)コンテナが所有するオブジェクトへの生ポインタと(a.2)コンテナが所有していないオブジェクトへの生ポインタにさらに細分することができます。あなたはコインを投げて決定するだけです。いずれかの顔に寝る場合は、(b)を使用します。立って休むことになるなら、(a.1)を使ってください。空気中に浮遊している場合は、(a.2)を使用してください。簡単ですね。 –
@ n.m。 LOL ...... –