7

クラスをコピー不可にすると、コードの品質が大幅に向上することがわかりました。最初はboost::noncopyableでこれを行いましたが、VC++コンパイラエラーはプライベートメンバーほど役に立たないことがわかりました(ダブルクリックするとコード内の間違った場所につながります)。

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

確かに、クラスが参照として渡されるべき場所に渡されなかったというかなりの数のケースを私に警告しました。そのため、コンストラクトを一度だけコピーする必要があるクラスでも警告を受け取りたいと思っています。

これを行う良い方法はありますか?たとえば、上記の 2 つのメソッドをプライベートのままにして、本当にコンストラクトをコピーしたいときに呼び出すパブリック T(T const&,bool dummy) コンストラクターを追加することを考えていました。または、上記の 2 つのメソッドを公開し、コピーの作成時に何らかの方法でコンパイラの警告をアクティブにして、必要な場所で警告を抑制します。

それとも、もっと良い方法がありますか?

4

4 に答える 4

6

それがまさにあなたが望むものかどうかはわかりませんが、コピーコンストラクターをマークするとexplicit、クラスを値渡ししたりコピー初期化したりすることはできませんが、直接初期化を使用してコピー構築できます。

おそらく、代入演算子を非公開にしたいでしょNonAssignableう。そのためにはベースが役立つかもしれません。

于 2011-07-07T19:17:17.760 に答える
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&);
};

于 2011-07-07T18:59:31.107 に答える
0

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

コピー コンストラクターによってトリガーされるデバッグ モードでの警告またはアサーションは、本当に探しているものでしょうか?

于 2011-07-07T22:02:02.420 に答える
0

デフォルトで a を作成してから、使用するメソッドをT追加することもできます。assignただし、これは完全に最適ではないように思われるため、コピーの必要性を確認することをお勧めします。

于 2011-07-07T19:01:01.727 に答える