0

私が持っているとします:

  • P と C の 2 つのクラス。
  • P <>-C 間の構成関係。つまり、P のすべてのインスタンスには、親の P インスタンスが破棄されると破棄される C のインスタンスが含まれます。

これを実装するには、C++ I で次のようにします。

  • 2 つのクラス P と C を定義します。
  • タイプ boost::shared_ptr の P のメンバー変数を定義し、P のコンストラクターで新しく作成されたオブジェクトで初期化します。

コード例を以下に示します。

    #include "boost/scoped_ptr.hpp"

    class C
    {
      public:
        C() {}

      private:

    };

    class P
    {
      public:
        P() : childC(new C()) {}

      private:
        boost::shared_ptr<C> childC;
    };

    int main(int argc, char** argv)
    {
        P p;
    }

どういうわけか、この単純なコード例を作成できず、その理由がわかりません (私はプログラミングの初心者です)。

エラー:

クラス「P」には「childC」という名前のフィールドがありません</p>

期待される ';' 「<」の前 トークン

「::」の無効な使用</p>

ISO C++ は型のない 'shared_ptr' の宣言を禁止します

4

2 に答える 2

3

エラーの原因として最も可能性が高いのはboost/scoped_ptr.hppboost::shared_ptr. hereが必要になる可能性はほとんどありませんboost::shared_ptr

この場合の構成を表現する最も簡単な方法は、

class C {};
class P 
{
 private:
  C c_;
};

の前方宣言のみを必要とするイディオムを使用して、コンパイル時の依存関係を減らしたい場合があります。Cその場合、Pのヘッダーは次のようになります。

#include <boost/scoped_ptr.hpp>

class C; // forward declaration

class P
{
 public:
  P() : c_(new C()) {}
 private:
  boost::scoped_ptr<C> c_;
};
于 2013-02-21T23:43:13.550 に答える
0

KerrekSB がコメントで示唆しているように、 を使用しましshared_ptrたが、 を含めscoped_ptrました。違いは、scoped_ptrは排他的所有権を表す (ここではそうです) のに対し、shared_ptr共有所有権は表します (そうではありません)。推奨されるイディオムはscoped_ptr、コード内で使用することです。

絶対に shared_ptr を使用したい場合は、ヘッダーを含めて<boost/smart_ptr/shared_ptr.hpp>ください。

于 2013-02-21T23:45:05.187 に答える