コピーさせない

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();
}

こんな感じに、ローカルクラスを使うと外部からはアクセスできないクラスになるんで、コピー不可能なクラスになるわけです。