• 締切済み

アドレスの代入禁止方法

宜しくお願いします。 私が考えている設計の、あるオブジェクトは生成されるインスタンスがプロジェクト内で単一であるとするものなので、アドレスの代入を禁止にしたいのです。 この場合はアドレスの代入禁止を目的としているので、メモリリークが発生していますがスマートポインタ等のメモリ管理法は使用しません。 operator=にてアドレスの代入禁止、もしくは別の方法がありましたら教えて頂けませんでしょうか。 以下はネット等を参考にしたソースコードです。 #include <crtdbg.h> class CHoge { public: CHoge(){}; private: CHoge(const CHoge&){}; CHoge& operator=(const CHoge&); }; int main() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // 具体的にはこのような場合を想定した時の為です CHoge *pHoge = new CHoge; CHoge hogeB; pHoge = &hogeB;//ここを禁止する方法がわかりません return 0; }

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> pHoge = &hogeB;//ここを禁止する方法がわかりません 一番手っ取り早い方法は、 class CHoge {  ... private:  CHoge* operator&() const; }; とすることだと思います。 ただし、この場合でも、 pHoge = reinterpret_cast<CHoge*>(&reinterpret_cast<char&>(hogeB)); とされるとアドレスが取れてしまいます。 もっとも、ここまでやるのは明らかに悪意がありますから、開発メンバーの人間性を問うた方がよいでしょう。 一応質問への回答としては上記の通りですが、できればきちんとSingletonパターンを使った方がよいとは思います。

--owata--
質問者

お礼

ご回答ありがとうございます。大変参考になりました! &そのものをprivateにするという発想は浮かびませんでした。。。 reinterpret_castはこういった用法があることも含め、まだまだ勉強や発想力が足りていないと実感します。 設計に関しては皆さんが仰ってるようにやはりSingletonパターンが典型的であって、見た人もわかりやすいのではないだろうかと思います。 また一つプログラミングテクニックを身に付けることが出来ました。 これからも精進していきます。 大変ありがとうございました。

  • koko_u
  • ベストアンサー率12% (14/116)
回答No.1

>生成されるインスタンスがプロジェクト内で単一であるとするものなので、アドレスの代入を禁止にしたい この前後の繋がりがわかりません。 インスタンスがプロジェクト内で単一であることが保証できれば、それを指し示すポインタ変数は複数あっても通常問題ないのでは? 典型的な Singleton パターンでは駄目な理由がわかりません。 >CHoge *pHoge = new CHoge; >CHoge hogeB; ここで既にヒープ領域とスタック領域に「2つ」CHoge インスタンスが生成されているのですが。。。

--owata--
質問者

補足

ご回答ありがとうございます。 申し訳ありません。単一オブジェクト云々は後で読み返しまして、当初に考えていた文章が混じっていたようです。 ですので単一オブジェクトにしなければならないという前提と設計は関係が無いということでお願いします。 この際、operator=での方法だけでも構いません。 ご教授お願いします。

関連するQ&A