2010-12-06 8 views
0

関数のクラスの実装を返したいと思います。この関数はライブラリにあります。ユーザーが返すオブジェクトを破棄しないようにしたい。どうすればこれを達成できますか?ユーザーがオブジェクトを破壊するのを防ぐ方法

EDIT:例。世界へ

インタフェース:

class Base 
{ 
    public: 
     virtual void foo() = 0; 
}; 

Base* GetFoo(); 

実装 - 内部:

class Bar : public Base 
{ 
    public: 
     void foo() { //Do something} 
}; 

Base* GetFoo() 
{ 
    return new Bar 
} 
+0

元の質問の範囲外ですが、なぜインタフェースベース(バーのインスタンス)を取得するために別の関数を使用しているのかわかりません。なぜファクトリメソッドを使用していないのですか? –

+1

ユーザーが試してみると、モニターが爆発するようにコンピューターをプログラムするだけです。 –

+0

Bar()のコンストラクタをプライベートにしたいと思っていますか? – Jaywalker

答えて

0

は、なぜあなたはそれをしたいのでしょうか?いずれにしても、返されたオブジェクトのコピーを取得する必要があります。また、コピーを割り当てるか割り当てを解除するかは、それらに依存していなければなりません。

+2

-1:特に役に立たない答え - 複雑なシステムでは、問題は現実的で珍しいことではありません。 「コピーを取得する」とは、一部の集中サービスへのアクセサーを与えられている場合は完全に役に立たず、コンストラクターやデストラクタによって継続的に影響を受けないハードウェアやOSリソースを開いている可能性があります。スマートなポインターでさえ、パフォーマンスとメモリー使用の妥協を意味します。アプローチの賛否両論を説明するのは合理ですが、その質問を無視するのは妥当ではありません。 –

+0

-1。トニーと同意。特にパフォーマンスに影響されやすいものを使用している場合は、ユーザーがオブジェクトプールを破壊してしまわないようにする必要があります(プールがそのメモリを再利用できるようにしないでください)。そして、コストがかかるという理由だけで、ユーザーが建設を避けるべきです。 – nakiya

0

あなたはロードされた銃を掃除しながら、足で自分自身を撮影するあなたのライブラリーのユーザーを禁止することはできません。私。たとえあなたが一定の参照を返すとしても、それからアドレスを取ってからdeleteそれを取ることができます。したがって、このような状況でもコードを安定させる必要があります。

P.S.プライベートデストラクタ(@ nc3b)は、クラスのさらなる使用に制限を課すため(例えば、ローカル非ダイナミックインスタンスはこれ以上ない)、賢明に考えてください。

+4

私は、ユーザーが明らかにあなたのライブラリーを壊そうとしているときを含め、すべての状況でコードを安定させる必要があることに同意しません。それが実現可能なときに行うことができますが、多くの場合、馬鹿馬鹿しい人々のあらゆる種類のことを考えようとすると、愚かです。 –

+0

@マッティ、私は同意する必要はありませんが、それぞれの状況において、馬小屋保護と自己健康チェックの間に合理的な妥協があると言います。 – Haspemulator

0

あなたはreturn INGはnewオブジェクトであるならどのような場合は、あなたがそれをINGのdeleteからユーザーを防ぐために必要があるべき理由理由はありません。

ただし、削除の責任について質問はしないでください。その代わりに、スマートポインタを使用して値を返すか、ポリモフィックなラッパーにポリモフィック実装へのスマートポインタ(通常はthisなどの値セマンティクスを提供するスマートポインタ)を使用します派生したインスタンスを返します。

2

あなたがベースから派生しているようにあなたの質問に答えるために、ベースデストラクタをプライベートにすることはできません。保護されたデストラクタによって目標を達成することができます。

1

shared_ptr<Base>を返して、ポインタのコピーを自分で保管してください。そのポインターは、ユーザーが彼のshared_ptr<Base>で何をするかにかかわらず、オブジェクトを生かし続けるでしょう。代わりにweak_ptr<Base>を返すことを検討しても、オブジェクトの寿命はあなたの気まぐれの対象に過ぎないと強調することもできます。

関連する問題