2009-03-17 12 views
5

私は、1つのパブリックメソッド内にオブジェクトを作成するクラスを持っています。オブジェクトはプライベートであり、クラスのユーザーには表示されません。このメソッドは、同じクラス内の他のプライベートメソッドを呼び出し、パラメータとして作成したオブジェクトを渡す:スマートポインタをクラス内の引数として渡す:scoped_ptrまたはshared_ptr?

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の実際の使い方についてはまだ混乱しています。

+1

「スタック上のオブジェクトを許可していない」ライブラリが不思議です。ライブラリ内のオブジェクトは、ヒープ上に工場で割り当てられていますか?ライブラリはポインタの所有権を持ち、それを削除しますか?スタックに割り当てられたオブジェクトを使用できない理由は何ですか? –

答えて

1

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

実際の使用では、可能な例外をすべてキャッチして手動で削除する必要はありません。実際に

あなたのオブジェクトがある場合は、あなたが

void privateMethod1(const Foo& fooObj); 

を使用して、私は「

privateMethod1(*fooObj.get()); 
+0

そのエンドはscoped_ptrとまったく同じです。メソッドパラメータを参照として宣言する必要はありません。しかし、そうしないと、驚くような方法で中断します(privateMethod1が返すと、fooObjはNullポインタになります)。 – sth

+0

はもちろんのことsthと同意します。 scoped_ptrが明らかに優れた選択肢である場合、なぜauto_ptrを使用しますか?所有権の移転は意図されていなかった。 –

+0

みんな、私は私のプロジェクトを後押ししていない。だから私はそのようなstlの解決策を提案したのです。 「所有権の移転」はどこにありますか? –

1

としてそこにオブジェクトを渡すために、より良いいただきたい確かに対象とあなたのAPIリターンオブジェクトを変更しません。 "スタック上のオブジェクトを許可しないライブラリを使用する場合は、ヒープ上にある必要があります。

なぜですか?これは通常、特別な方法で割り当てを解除する必要があることを意味します。したがって、これらのソリューションのどれも動作しない可能性があります。

void privateMethod1(Foo *fooObj); 

void showSomethingOnTheScreen() { 
    scoped_ptr<Foo> fooObj(new Foo); 
    privateMethod1(fooObj.get()); 
}; 
+0

@Earwicker私たちが使用しているコンパイラはBorland C++で、使用しているライブラリはC++にバンドルされているVCL GUIライブラリです。 それは間もなく変わりますが、私は今これに固執しなければなりません。 何らかの理由で、VCLをヒープ上に配置する必要があります。理由は分かりません。 –

+0

おそらく、ライブラリには作成されたオブジェクトへのポインタを返すファクトリメソッドがあり、所有権をユーザに渡すことを意味します。 –

+0

本当にオブジェクトを削除する必要はありますか?私はVCLを使ったことはありませんが、親が削除されたときにコンポーネントを自動的に削除するという曖昧な考えがあります。 –

3

一つの更なる可能性はメモリ管理を容易にするためstatic_ptrなどのオブジェクトを作成しますが、ちょうど他のプライベートメソッドに生のポインタを渡すことですprivateMethod1への生ポインタ(または参照)、例えば

scoped_ptr <Foo> fooObj(new Foo);
privateMethod1(fooObj.get());

3

は私がshowSomethingOnTheScreen内scoped_ptrを使用することになりますが、合格:

+0

それは私の本当の推測でしたが、このプラクティスはお勧めですか?それが私のやり方だとすれば –

0

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

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

    public: 
     void showSomethingOnTheScreen() { 
      scoped_ptr<Foo> fooObj(new Foo); 
      privateMethod1(*(fooObj.get())); 
     }; 
};