- ベストアンサー
C++で他からの削除を禁止させたい
C++で、Factoryパターンで利用者にオブジェクトを、基本クラスの型で提供して使わせる部分を設計&実装しようとしているところです。 利用者に、提供したオブジェクトをdeleteで削除されると、管理しているFactoryがCoreを吐いて落ちてしまうと思いました。 利用者にはオブジェクトの寿命を気にせずに使ってもらいたいのです(そのための管理のしくみなので)。でも、設計書にどんなに謳っても、やっちゃう人はやっちゃいます。 deleteをさせないようにするにはどうすればよいでしょうか?friend以外で解決策はないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> deleteをさせないようにするにはどうすればよいでしょうか?friend以外で解決策はないでしょうか? ポインタを渡さなければいい。 Handle-Bodyのイディオムでいけるでしょう。
その他の回答 (2)
- piyo2000
- ベストアンサー率49% (144/293)
C++はあまり得意ではないので参考程度に(^^; 結構めんどうでしょうけど、私はdelete(とnew)をオーバーライドする方法が真っ先に思いつきました。 メモリリークを調べる場合よくやる手のようですね。 >設計書にどんなに謳っても、やっちゃう人はやっちゃいます。 それはそのプログラマのスキルの問題でしょう。 「なぜnew-deleteするのか」ということが分かっているならやらないでしょうし。 そういう意味では >利用者にはオブジェクトの寿命を気にせずに使ってもらいたい は良くないのかな、とも思います。
お礼
回答ありがとうございます。 実装寄りの質問文で、僕の説明が下手で紛らわしくてごめんなさい。 根本的に、こういった問題に対するC++言語的制約に依存しない、いわゆる普通の設計(僕が知らないだけ)があるのかもと思っての質問でした。 Factory自体が、オブジェクトの実体の生成を意識させないためのしくみなので、利用者には寿命すら意識させたくない、deleteしなくて済むような、又はdeleteされても問題ないような設計にしたかったのです。 実は非同期オブジェクトなので、処理中にdeleteされると困るな、と。システムダウンの原因は作りたくないな、と。ま、非同期でなくても同じですが。
- MASATO3
- ベストアンサー率60% (27/45)
C++はガベージコレクションが無いので、関数がオブジェクトへのポインタを返すような場合、誰がdeleteするのかというのがいつも問題になりますね。 boostライブラリのshared_ptrのような、オブジェクトの破棄が自動的に行われるスマートポインタクラスを使ってみては如何でしょうか。
お礼
epistemeさんの回答にあわせて、MASATO3さんのスマートポインタも考慮してみようかと思います。ありがとうございました。 利用オブジェクトが非同期動作なので、Handleオブジェクトはスマートポインタで寿命を動的にさせ、削除されるタイミングでまだ実行中なら中断処理に走らせるしくみを考えてみます。
お礼
Handle-BodyのBridgeパターンはいいアイデアですね。 利用オブジェクトをHandleインターフェースとBody実装の構造にして、Handle部分は参照型かoperator=()で実体を持たせて、実装部分をprivateな共有オブジェクトにするのですね。 これだとdeleteの心配がなくて助かります。 考え付きませんでした。 ありがとうございました。