2

何をするのが正しいですか?コンテナーが基本クラスの値型である場合、格納された派生オブジェクトは「スライス」されることを知っています。コンテナーが派生クラス型の場合、基本クラス オブジェクトは格納できません。右?

ポインタを使用する場合、auto_ptr はコピー セマンティックの問題があるため使用できません。この問題を処理する唯一の解決策は shared_ptr ですか?

この問題に対処する詳細、サンプル コード、またはオンライン記事を提供してくれる人はいますか? これはよくある質問ですが、教科書やオンラインではあまり情報が見つかりませんでした。

前もって感謝します。

ところで、unique_ptr で検索するだけです。コピー セマンティクスをサポートしていないようです。STL で使用するのは auto_ptr よりも安全なだけではありませんが、unique_ptr のコンテナーでは多くの STL 操作またはアルゴリズムを使用できないため、コピー セマンティクスが不足しているためでしょうか。

4

4 に答える 4

5

ポリモーフィックな動作が必要な場合 (実際に必要な場合) は、ポインターまたは参照を使用する必要があります。それは多くの場所で十分に文書化されています。

また、参照のコンテナーを使用できないため、ポインターのコンテナーを使用する必要があります。

unique_ptrこれで、適切と思われる任意のタイプのポインター、shared_ptrまたは生のポインターを使用できます。

于 2012-09-02T09:05:25.807 に答える
2

最も明白な解決策は、std::unique_ptrを使用することです。

class IBase {};
class Derived : virtual public IBase {};
std::vector<std::unique_ptr<IBase>> v;
v.push_back(std::unique_ptr<IBase>(new Derived())); 

std::shared_ptrを使用することもできますが、所有権のセマンティクスによってプログラムの動作が大幅に変更され、動的に割り当てられたオブジェクトが誰も参照を保持しなくなるまで生き続けます。

于 2012-09-02T09:04:15.323 に答える
2

std::vector と std::shared_ptr の例があります。それがあなたの望みだと思います。

#include <iostream>
#include <memory>
#include <vector>

class Base {
public:
   virtual void foo() {
      std::cout << "base" << std::endl;
   }
};

class Derived : public Base {
   void foo() {
      std::cout << "derived" << std::endl;
   }
};

int main()
{
   std::vector<std::shared_ptr<Base> > v;
   v.push_back(std::shared_ptr<Base>(new Base));
   v.push_back(std::shared_ptr<Base>(new Derived));

   for (auto it : v) {
      it->foo();
   }
}
于 2012-09-02T09:06:13.073 に答える
0

[http://www.boost.org/doc/libs/1_51_0/libs/ptr_container/doc/ptr_container.html](Boost ポインター コンテナー ライブラリ) は、このためだけに作成されています。

于 2012-09-02T09:13:09.250 に答える