2011-07-07 5 views
7

クラスをコピー不可能にすると、コード品質が向上します。最初はboost :: noncopyableでこれを行いましたが、私はVC++コンパイラのエラーがプライベートメンバーと同じように役に立たないことを発見しました(コード内の間違った場所へのダブルクリック)。C++ノンコピー可能な場合を除いて

T(T const&); 
T& operator=(T const&); 

確かに、それはなかったクラスは、彼らが持っている必要があり、参照として渡されていなかったかなりの数の例に私を警告しています。そういうわけで、クラスを一度だけコピーする必要があるクラスでも、私は非常に警告を受けたいと思っています。

これを行うには良い方法がありますか?私は、上記の2つのメソッドをプライベートにし、パブリックT(T const &、ブールダミー)コンストラクタを追加して、実際にコンストラクトをコピーしたいときに呼び出す例を考えていました。または、代わりに、上記の2つのメソッドをpublicにして、コピーの作成時にコンパイラの警告を何らかの形でアクティブにし、私がしたいところで警告を抑制します。

多分もっと良い方法がありますか?

答えて

6

コピーコンストラクタexplicitをマークした場合、そのクラスは値渡しやコピー初期化はできませんが、直接初期化を使用してコピーコンストラクトを行うことはできます。

おそらく代入演算子を非公開にしたいと思うかもしれませんが、おそらくNonAssignableのベースが便利です。

+1

私はこの答えが一番好きです。私の経験では、コピーコンストラクタの問題は、いくつかの大きなオブジェクトで "偶然"呼び出されるときです。 '明示的に'は、あなたが呼び出すときにそれについて考えるように強制します。 – Nemo

+0

乾杯、これは私のニーズに完全に合っています。ありがとう。 – Cookie

2

私はあなた自身に完璧な方法で名前を付けたと思います。以下は

を飛ぶませんコメントで述べたように

struct T 
{ 
    friend class SomeClientThatCanConstructT; 
    T(T const&); 

    private: 
    T(T const&);   
}; 

:(?)

は、私はちょうど私がかつて私が上で働いていた別のコードベースで演奏小ぎれいなトリックを思い出しました 明示的な名前(CopyConstructなど)を選択し、RVOを使用すると効率的です:

struct T 
{ 
    inline T CopyConstruct() const  { return *this; } 
    inline T& AssignTo(T& dst) const { return dst = *this; } 
    inline T& AssignFrom(const T& src) { return *this = src; } 

    private: 
    T(T const&); 
    T& operator=(T const&); 
}; 

+0

私はこれについて考えましたが、あなたの 'CopyConstruct'は、コンパイラがそれを呼び出さなくてもコピーコンストラクタにアクセス可能であることを要求します。 –

+0

シュート。私に思い出させてくれてありがとう。これは確かにストッパーです。もちろん、それはすべての方法で醜いことができますが、コンストラクタ呼び出しでは、本当にあなたの 'タグパラメータ'のソリューションの代替はありません。それを考えてみると、私は突然これを自分自身でやっていることを覚えています...回答を更新する – sehe

+0

その友人のビットが今やトリックをするようです。 –

0

あなたは、おそらく使用するassignメソッドを追加しTを構築し、デフォルトの可能性があります。これは完全には最適ではないようですが、コピーの必要性を確認する必要があるかもしれません。

0

誤って使用する可能性があるので、タイプ(CopyConstructibleはstdlib全体で頻繁に使用されている概念です)を制限するという考え方は嫌いです。別のインスタンスからオブジェクトを構築することができる場合は、コピーを構成可能にする必要があります。また、実際の目的を果たすことなく、重要なコードから読者を逸らす。

おそらく、コピーコンストラクタによってトリガされる警告モードまたはアサーションが、あなたが探しているものでしょうか?

+0

そんなことはありますか?例えばコンパイラやリンカが関数にリンクするたびに、ユーザ定義の警告を定義できますか?私は望んでいるオブジェクトファイルの警告を抑制する?プラグマの警告を無効にするように? – Cookie

関連する問題