2013-03-18 8 views
9

抽象基底クラスをコピーできないようにし、そこから派生するクラスを強制的にコピー不可にしたいと考えています。以下のコードでは、noncopyable.hppに定義されているBoostのnoncopyableを使用していますが、派生クラスDはコピーコンストラクタを定義できます。継承されたクラスのコピーコンストラクタの定義を禁止する

class noncopyable 
{ 
    protected: 
     noncopyable() {} 
     ~noncopyable() {} 
    private: // emphasize the following members are private 
     noncopyable(const noncopyable&); 
     const noncopyable& operator=(const noncopyable&); 
}; 

class D : noncopyable 
{ 
    public: 
     D() { } 
     D(const D&) { } 
}; 

int main() 
{ 
    D a; 
    D b(a); 

    return 0; 
} 

このコードは、私はそれがD'sのコピーコンストラクタについてのコンパイル時にエラーをスローすると予想する場合、コンパイルして実行(http://ideone.com/g4gGLm)。たぶん私は、このコピー不可クラスが何を意味するのかを誤解しているのかもしれません。その場合、派生クラスにコピーコンストラクタを定義させないように強制する方法はありますか? (答えはC++ 11を使用できますが、好ましくはブーストできません)

答えて

3

Dのコピーコンストラクタを削除する必要があります。今では、ベースクラスのコピーを作成しようとしないことで、Dのコピー構築を許可しています。以下のバリアントはコンパイルされません。

class E: noncopyable 
{ 
}; 
E e, e2(e); 

class F: noncopyable 
{ 
public: 
    F(const F &init): noncopyable(init) 
    {} 
}; 
+0

私は今、あなたのクラスEの例のおかげで、コピー不可能なものについて理解しています。ありがとう – steve9164

12

D(const D&)はコピーコンストラクタではなく、基本クラスのデフォルトコンストラクタを呼び出すためです。

コピーコンストラクタは呼び出されないため、明示的に要求しない限り、ベースオブジェクトのコピーは作成されません。

D(const D& d) : noncopyable(d) { } 

実際にはエラーが発生します。実際、問題は問題ではありません。noncopyableのコピーはありません。

私は、派生クラスに強制的にコピーを許可しないようにするための簡単な方法がないことを認識していません。

+0

なぜコピーを禁止することをお勧めしますか? – steve9164

+1

@ steve9164は、派生クラスにコピーを許可しないように強制する目的のために、読めないコードを書くことはお勧めしません。 –

+0

結果のコードが判読不可能だった場合は、はい、それはおそらく価値がないことに同意します – steve9164

関連する問題