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