9

含まれているオブジェクトをそのクラスへのポインターとして宣言し、ヘッダーファイルでそれらを「前方宣言」するのが一般的です。これは、コード内の物理的な依存関係を減らすためです。

例えば

class B;  // forward declaration   

class A {
   private:
      B* pB;
};

そのようなメンバーをネイキッド ポインターではなく、shared_ptr として宣言するのは良い考えでしょうか?

私はscoped_ptrを好むでしょうが、それは標準ではありません。

4

4 に答える 4

6

はい、できます(すべきですか?)。

これは一般的な方法です。あなたが述べたように、それは明示的にdelete()を呼び出す必要性を回避します。

さらに先に進むことができます。次に例を示します。

class RSAKey
{
  public:

    RSAKey();

  private:

    shared_ptr<RSA> d_rsa; // A pointer to a RSA structure from OpenSSL
}

私はこのように初期化します:

RSAKey::RSAKey()
{
  RSA* rsa = RSA_generate_key(1024, 1, NULL, NULL);

  if (NULL == rsa) throw DummyException();

  d_rsa.reset(rsa, RSA_free); // Note the specific release method.
}

d_rsaが使用されなくなると、への自動呼び出しRSA_free()が発生します。かっこいいじゃないですか!


アップデート

がオプションの場合は、オーバーヘッドが少なく移動可能な代わりにC++11使用する方がよいでしょう。std::unique_ptr

これは、コピーに関して、囲んでいるクラスをどのように動作させるかによって異なります。

于 2010-05-10T09:52:37.360 に答える
2

このポインターがクラス実装から渡されず、実行速度が重要な場合は、shared_ptr の代わりに scoped_ptr を使用してください。shared_ptr にはオーバーヘッドがあります。

于 2010-05-10T09:57:30.053 に答える
1

ashared_ptrを使用すると、所有権を別のオブジェクトに渡すことができるため、外側のオブジェクトが破棄されても破棄されません。この特定のケースでは、これは問題にならないと述べています。

delete pBスマート ポインターの唯一の利点は、デストラクタに a を忘れずに入れる必要がないことです。それはほとんどの人にとって十分な利点かもしれません。

所有権の問題を心配する必要がない場合は、auto_ptr意志でも十分です。

于 2010-05-10T16:31:08.357 に答える
0

コンポジションの場合、はい、物理的な依存を望まない場合は良い考えです。その後、AがいるときにBが自動的に破壊されます.

物理的な依存関係を気にしない場合は、データ メンバーを値で保持できます。

(物理的な依存が問題である場合は、pimpl イディオムを確認することもできます。)

于 2010-05-10T08:59:44.143 に答える