10

抽象基本クラスをコピー不可にし、それから派生するクラスを強制的にコピー不可にしたい。以下のコードは、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のコピーコンストラクターに関するコンパイル時エラーをスローすると予想したときに、コンパイルして実行します( http://ideone.com/g4gGLm )。たぶん私は、このコピー不可能なクラスが何を意味するのかを誤解しました。もしそうなら、派生クラスにコピーコンストラクターを定義しないように強制する方法はありますか?(回答はC ++ 11を使用できますが、ブーストはできません)

4

2 に答える 2

13

これが機能する理由D(const D&)は、コピーコンストラクターではなく、基本クラスのデフォルトコンストラクターを呼び出すためです。(最初は直感に反しますが、すべてのコンストラクターがこのように動作することを考えると理にかなっています)

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

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

これは確かにエラーになります。したがって、実際には、あなたの問題は問題ではありません-進行中のコピーはありませんnoncopyable

派生クラスにコピーを強制的に許可しない簡単な方法を私は知りません。また、コピーがある場合はそれを使用することをお勧めしません。

于 2013-03-18T11:39:44.410 に答える
3

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

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

class F: noncopyable
{
public:
  F(const F &init): noncopyable(init)
  {}
};
于 2013-03-18T11:44:15.827 に答える