• ベストアンサー

C++で他からの削除を禁止させたい

C++で、Factoryパターンで利用者にオブジェクトを、基本クラスの型で提供して使わせる部分を設計&実装しようとしているところです。 利用者に、提供したオブジェクトをdeleteで削除されると、管理しているFactoryがCoreを吐いて落ちてしまうと思いました。 利用者にはオブジェクトの寿命を気にせずに使ってもらいたいのです(そのための管理のしくみなので)。でも、設計書にどんなに謳っても、やっちゃう人はやっちゃいます。 deleteをさせないようにするにはどうすればよいでしょうか?friend以外で解決策はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

> deleteをさせないようにするにはどうすればよいでしょうか?friend以外で解決策はないでしょうか? ポインタを渡さなければいい。 Handle-Bodyのイディオムでいけるでしょう。

oxygene
質問者

お礼

Handle-BodyのBridgeパターンはいいアイデアですね。 利用オブジェクトをHandleインターフェースとBody実装の構造にして、Handle部分は参照型かoperator=()で実体を持たせて、実装部分をprivateな共有オブジェクトにするのですね。 これだとdeleteの心配がなくて助かります。 考え付きませんでした。 ありがとうございました。

その他の回答 (2)

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

C++はあまり得意ではないので参考程度に(^^; 結構めんどうでしょうけど、私はdelete(とnew)をオーバーライドする方法が真っ先に思いつきました。 メモリリークを調べる場合よくやる手のようですね。 >設計書にどんなに謳っても、やっちゃう人はやっちゃいます。 それはそのプログラマのスキルの問題でしょう。 「なぜnew-deleteするのか」ということが分かっているならやらないでしょうし。 そういう意味では >利用者にはオブジェクトの寿命を気にせずに使ってもらいたい は良くないのかな、とも思います。

oxygene
質問者

お礼

回答ありがとうございます。 実装寄りの質問文で、僕の説明が下手で紛らわしくてごめんなさい。 根本的に、こういった問題に対するC++言語的制約に依存しない、いわゆる普通の設計(僕が知らないだけ)があるのかもと思っての質問でした。 Factory自体が、オブジェクトの実体の生成を意識させないためのしくみなので、利用者には寿命すら意識させたくない、deleteしなくて済むような、又はdeleteされても問題ないような設計にしたかったのです。 実は非同期オブジェクトなので、処理中にdeleteされると困るな、と。システムダウンの原因は作りたくないな、と。ま、非同期でなくても同じですが。

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.1

C++はガベージコレクションが無いので、関数がオブジェクトへのポインタを返すような場合、誰がdeleteするのかというのがいつも問題になりますね。 boostライブラリのshared_ptrのような、オブジェクトの破棄が自動的に行われるスマートポインタクラスを使ってみては如何でしょうか。

参考URL:
http://boost.cppll.jp/HEAD/libs/smart_ptr/smart_ptr.htm
oxygene
質問者

お礼

epistemeさんの回答にあわせて、MASATO3さんのスマートポインタも考慮してみようかと思います。ありがとうございました。 利用オブジェクトが非同期動作なので、Handleオブジェクトはスマートポインタで寿命を動的にさせ、削除されるタイミングでまだ実行中なら中断処理に走らせるしくみを考えてみます。

関連するQ&A

  • C#のdelegateをC++とjavaで?

    C#のデリゲードを javaとC++でできないでしょうか。 ただし、質問内容を勘違いされそうなので、求めている内容と、 求めていない内容を、詳しく 書きますと。 インタフェース委譲を使った例は、求めていません。 あらかじめ、委譲先に静的に仕組みを 作っておかなく手も、C#のデリゲードのように、シグニチァが同じなら 委譲先をはめ込めれるのが欲しいです。 単なる関数ポインタの例は、求めて いません。 C#でdelegate型を引数にとる ところに、あるインスタンスの メソッドを渡すと。 どのインスタンスのどのメソッドかまで、 認識して、コールバックできます。 関数ポインタでは、これができない。 STLの関数オブジェクトとか、古い感じの情報にヒントがあるか。調べてみましたが。よくわかりませんでした。 結局、この関数オブジェクトは、僕が求めているモノとは、違うような気がします。 よくわかりませんが。 欲しいのは、どのインスタンスのどのメソッドかまでを特定して、 記憶できる型をどうやって javaや、C++で実装できるか。 それをインタフェース委譲のように、 委譲先にあらかじめ、仕込んでおくことなしに。 ただ、メソッドのシグニチァが同じであるだけで、どのインスタンスのどのメソッドかまでを特定して記憶できる C#のデリゲードのような型を。 特殊なコンポーネントを利用せず。 標準的な言語構文のみをつかって、 どのようにしたら、 javaや、C++で、実装できるか? です。 詳しい方が、いらっしゃいましたら、 教えてください。

  • Factory Method パターンの利点

    いつも参考にさせて頂いてます。java で良い設計ができないか試行錯誤している時に、デザインパターンなる定石パターンがあることを知りました。そこで、Factory Method パターンについて、 ・どのようなケースで利用するのか? ・利点は何か? を簡単に説明して頂けたらと思います。お願いします。

    • ベストアンサー
    • Java
  • トランザクション管理について

    皆さんはトランザクション管理を何処で行ってますか? 大体のプロジェクトでは以下の2パターンに集約されると思います。 1.ビジネスロジックでトランザクション管理して、DAOへ引数としてトランザクションを渡す。  当然、コミット・ロールバックはビジネスロジック側で管理。 2.ビジネスロジック側では管理せず、DAO側で管理。  ビジネスロジックへは結果のみ返却。 実は今回のプロジェクト、Java初心者(プログラムって何?レベルとC++なら受講したことあるよ!レベル)が9割を占めるチームです。 初心者の方々はビジネスロジックを設計・実装します。 それ以外の部分(DB・SpringFramework等)を私が設計・実装します。 ビジネスロジックの部分の設計も、概要設計レベルしか記述されておらず、トランザクション無視の設計しかありません。 バグにまみれてデスマーチなんてごめんなので、2のパターンでトランザクションからDB周りを設計したいと思っているのですが、リーダー(スキルは不明。経験はあるらしい)が「DAO側でやると上手くいかない場合が多い」と言われ、却下されそうです。 何処がどう上手くいかないのか聞いても、明確に返答は貰えません。 でもなんとか2のパターンでいきたいのですが、上手い説得方法が見つかりません。 なんて言えば納得してくれそうか、皆様のお知恵を拝借したく投稿しました。 足らない部分は補足させていただきます。 よろしくお願いします。

    • ベストアンサー
    • Java
  • テンプレートの書籍

    テンプレートについて、学びたいと思っています。 当方、C++については、オブジェクト指向分析・設計から実装まで、 業務システム開発を、特に問題なく行っています。 デザインパターンも、ある程度は理解しています。 最近、テンプレートを趣味的に勉強しようと思いだしまして、 できるだけ平易なものを、楽しく読んでみたいと思っています。 そこで、こういう書籍をこういうステップで読んでいったら よい(よかった)など、教えていただければ幸いです。 面白く読めそうなWebサイトなどでも結構です。 ご紹介よろしくお願い致します。

  • Windowsの分かりやすい雑誌を教えてください

    社内システムでWindows系サーバの管理や開発を任されることになりました。開発といっても設計・実装は外注で、要件定義が主です。 初めてに近い仕事内容になるのですが、これらをやっていくために参考になる書籍はあるでしょうか? 例えば日経が提供している年間購読の雑誌など。できれば最新技術動向なんかも分かるものが望ましいです。

  • 『オブジェクト化』の実装例が よく分からない

    『オブジェクト化』の実装例が よく分からない 保守性を高めるために オブジェクト化を進めることが大切なのは 雰囲気的に分かります。 ところが、実際に何をすればよいか、という段階になると 具体策が見えてきません。 以前に、下記の回答が出されていましたが 意味が良く分からないで困っています。 ========== 過去の回答 ======== http://okwave.jp/qa/q8601972.html ・マジックナンバー、マジックストリングを排除する オブジェクト内に定数プロパティとしてまとめ ・処理のメソッド化 「変数・定数をすべて1つのオブジェクトにまとめる」 「処理はオブジェクトのメソッドにまとめる」 更に、定義したオブジェクト類は別ファイルに切り離し、 そのスクリプトファイルをロードするようにすれば、 ページデザインと処理(ビジネスロジック)も切り離し別々に管理できます。 ========================= これより分かりやすい実例を教えていただけますでしょうか。 ありがとうございます。

  • クラス設計の良い参考書を教えてください

    このたび、仕事で初めてC++を前提にした設計をすることになったのですが、プログラミングも含め、C++自体が全く初めてです(オブジェクト指向自体も初めてです)。あまり時間もないので、良い参考書を探しております。特に、良いクラス設計の思想、設計例などが解説されている参考書などありませんでしょうか。時間が無いので極力邦書を希望します。GoFの再利用のためのデザインパターンの本(業務命令により購入済み)と、平行して進めるつもりですので、これと思想が違わないものが希望です。

  • オブジェクト指向の勉強にちょうど良いソースコードはありませんか?

    オブジェクト指向の勉強にちょうど良いソースコードはありませんか? VB6からVB.NETへの移行中ですが、VB.NETは本格的にオブジェクト指向言語となったそうで、オブジェクト指向といえばデザインパターンらしいので勉強をしつつリファクタリングを行っています。 デザインパターンのサンプルコードはwebで散見されますが、どれも説明に必要な最小限のコードなので実際の開発にどのように適用したらよいかいまいちイメージできない部分があります。 また、具体的なところだと、オブジェクト指向ではオブジェクト間の結合度を弱くしてグローバル変数を極力使用しないとありますが、設定値を管理するオブジェクトのようにあちこちから参照されるものはやはりグローバルにするのが一般的なのでしょうか。 設計の参考になるソースコードとかサイトとか教えてください。 ちなみに、今作成しているのは測定器や電源装置などを制御してデータ収集したりする制御系のソフトです。

  • オブジェクト指向について

    趣味でプログラミングをしているのですが オブジェクト指向の概念がうまく理解できていないので 教えていただけませんでしょうか? 解説本などを読むと、オブジェクト指向のクラスを動物クラスを継承して犬クラスや猫クラスなどと解説してあるのですが。 どうも、僕がプログラム設計するとしっぽクラスや泣き声クラスなどといった違った動物の類似機能をまとめてのクラスをつくり各メソッドとしてしまいまっています。 動物クラスや乗り物クラスを組み合わせてプログラムを設計する事ができません。 本格的なプログラムを組む用途では無いので気にしなくても目的の機能が実装できれば問題無いと知人からは言われ(面倒なので教えたくないのかもしれませんが)そのまま来てしまいました。 最近、気になって来たので。 正しい使い方を身に着けたいと思いチャレンジしていますが、変な癖がついていて犬や猫クラスなどと思いながら設計していると思考が止まってしまいます。 そこで、下記のことを教えていただけませんでしょうか? (1)泣き声クラスなどの同機能を1つのクラスにしてしまう設計しか出来ない(発想できない)のは考え方のどこがわるいのでしょうか? (追記:一部分だけならペンギンクラス猫クラスなどと言う動物クラスの継承的な発想はできるのですが実際のプログラミングの際は動物のようなわかり易い物オブジェクトとして目に見える物体ではない事柄をオブジェクト化にする事が難しく感じるのではないかと思います。) (2)今までの小さい規模での開発なら、クラスのつくり方がおかしくても不具合は無かったのですが、どのような時に困る事があるのでしょうか?(解説などでも再利用性などと、さらっと解説されていますがイマイチぴんときません) (3)正しくオブジェクト指向がマスター出来ている方にとって、どのクラスにどのメソッド実装するか悩む事などはあるのでしょうか? また、設計で一番悩むのはどのあたりですか? (4)UMLのマスターは必須でしょうか?(現在は、なんとなくUMLぽい感じでメモ書きをつくり、えせオブジェクト指向でプログラムを組んでいます。) (5)その他アドバイスがあればお願いします。 ※乱文で問題もハッキリせず質問の整理等がうまくいっていないと思いますが1つの項目だけでも構いませんので、ご教授お願いします。

    • ベストアンサー
    • Java
  • androidのPUSH通信

    お世話になります。 現在androidのPUSH通信の設計をしているのですが、C2DMが一般的な方法と見受けられます。しかし、C2DMはグーグルのアカウントをもっているユーザーしか利用できないので、今回のアプリに実装が出来かねる状態です。 最近流行しているLINEのような、グーグルアカウントもっていなくてもPUSH通信ができるような仕組みはないものなのでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • Java