1

これはばかげた質問かもしれませんが...

私はコピーできないメンバーを利用する多くのクラスを書いてきました。これらのクラスは、私のソースのコピーコンストラクターを介して初期化されることはありません。独自のコピーコンストラクターを提供せずにコンパイルしようとすると、g ++は、コピーできないメンバーオブジェクトが原因で、デフォルトのコピーコンストラクターをビルドできない方法について多くのエラーをスローします。

コピーコンストラクターを提供しないようにコンパイラーに指示する方法はありますか?

編集: ええ...ばかげている...私はboost::bind呼び出しで誤ってコピーコンストラクターを呼び出していたケースがありました。学んだ教訓。

4

5 に答える 5

9

物事をコピー不可能にする通常の方法は、コピーコンストラクターを宣言するが定義せず、何も呼び出せないようにプライベートにすることです。

言語の次のリビジョンは、これらの生成された関数を抑制する明示的な方法を提供します。

于 2010-04-27T19:53:39.947 に答える
6

実際にコピーコンストラクターを呼び出さない場合、コンパイラーがコピーコンストラクターを生成できなくてもエラーにはなりません。あなたが(おそらく間接的に)コピーコンストラクターを使用させているようです。

独自のコピーコンストラクターを宣言することで、コンパイラーによって生成されたものを抑制することができます(使用していない場合は定義する必要はありません)。privateクラスのセクションに配置できます。

これによりエラーが変更され、コピーコンストラクターにアクセスできない、またはリンクエラーが発生した場合は、実際にコピーコンストラクターが使用されているため、これがなぜであるかを分析する必要があります。

于 2010-04-27T19:54:27.427 に答える
3

現在のバージョンのC++にはありません。C ++ 0xでは、=delete;自分で定義しなかった場合にコンパイラーがデフォルトで生成する特別なメンバー関数の1つが不要であることを示す構文があります。

于 2010-04-27T19:52:58.700 に答える
3

新しいC++0x標準が完全にサポートされるまで、できる最善の方法は、特殊メンバー関数のバージョンを宣言することですが、それらを実装することはできません。通常、これらは非公開になります(使用してはならないことを明確にするため)。


Class foo
{
    // ... rest of definition
    private:
        foo (const foo& rhs); // Do Not Implement
        const foo& operator= (const foo& rhs); // Do Not Implement
};
于 2010-04-27T19:57:58.263 に答える
2

いいえ :)

クラスをコピーできないようにする場合は、次のようなものを使用します。boost::noncopyable

class MyClass : private boost::noncopyable
{

}

または、プライベートコピーコンストラクターを宣言するパラメーター化されたマクロをクラス定義で使用します。

于 2010-04-27T19:54:57.443 に答える