コピーさせない
C++で実体をコピーさせたくない場合、通常はコピーコンストラクタと代入演算子をprivateにしたり、boost::noncopyableを使う。
で、考えたんですが、そもそも「実体」にアクセス出来ないようにしてしまえばいいんじゃないかと。
以下実装例です。
#include<iostream>// インターフェイスを用意する。classInterface {public:virtualvoidfunc() = 0; };// オブジェクトへのポインタを取得する関数。// std::aut_ptr等で返すのもOKInterface* createObject() {// ローカルクラスを作成。classConcreteObject :publicInterface {public:voidfunc() { std::cout <<"func"<< std::endl; } };// ローカルクラスをnewして返す。returnnewConcreteObject; }intmain() {//ConcreteObject obj1; // これはコンパイルエラー//cerateObject::ConcreteObject obj2; // これもNGInterface* ptr = createObject();// OKInterface& ref = *ptr;// OKref = *(createObject());// OK// 呼び出しはもちろんOKptr->func(); ref.func(); }
こんな感じに、ローカルクラスを使うと外部からはアクセスできないクラスになるんで、コピー不可能なクラスになるわけです。