5

1 つのパブリック メソッド内にオブジェクトを作成するクラスがあります。オブジェクトは非公開で、クラスのユーザーには表示されません。次に、このメソッドは同じクラス内の他のプライベートメソッドを呼び出し、作成されたオブジェクトをパラメーターとして渡します。

class Foo {
   ...
};

class A {
   private:
      typedef scoped_ptr<Foo> FooPtr;

      void privateMethod1(FooPtr fooObj);

   public:
      void showSomethingOnTheScreen() {
          FooPtr fooObj(new Foo);
          privateMethod1(fooObj);
      };
};

この場合の正しいスマート ポインターは scoped_ptr になると思いますが、scoped_ptr をそのように使用するとクラスがコピー不可になるため、これを行うことはできません。メソッドを次のように作成する必要があります。

void privateMethod1(FooPtr& fooObj);

privateMethod1 はオブジェクトを保存せず、その参照も保持しません。クラスFooからデータを取得するだけです。

正しい方法は、おそらくスマート ポインターをまったく使用せず、オブジェクトをスタックに割り当てることですが、スタック上のオブジェクトを許可しないライブラリを使用するため、それは不可能です。オブジェクトはヒープ上にある必要があります。

結局のところ、scoped_ptr の実際の使用法についてはまだ混乱しています。

4

5 に答える 5

1

スタック上にオブジェクトを作成できないため、ここでは単純な std::auto_ptr を使用します。そして、生のポインタを単に受け入れるだけのプライベート関数の方が良いです。

実際の使用法は、考えられるすべての例外をキャッチして手動で削除する必要がないことです。

実際、オブジェクトがオブジェクトを変更せず、APIがオブジェクトを返す場合は、使用する方がよいでしょう

void privateMethod1(const Foo& fooObj);

オブジェクトをそこに渡します

privateMethod1(*fooObj.get());
于 2009-03-17T18:16:46.747 に答える
0

その場合、割り当てメカニズムを置き換えるだけで済みます。
ヒープ上にオブジェクトを作成しますが、プライベート メソッドへの参照としてオブジェクトを渡します。

class A {
   private:
      void privateMethod1(Foo& fooObj);

   public:
      void showSomethingOnTheScreen() {
          scoped_ptr<Foo> fooObj(new Foo);
          privateMethod1(*(fooObj.get()));
      };
};
于 2009-03-17T18:29:51.877 に答える