1

私は関数インターフェースを持っています:

struct iFace {
  virtual Type& getType() = 0;
}

アイデアは次のように取得することです:

iFace& iface = getIface();
Type& type = iface.getType();

しかし、私は時々間違いをして次のように書きます。

Type type = iface.getType();

これは値でコピーしますが、これは避けたいものです。しかし、私がそのような間違いをしたとき、コンパイラはその正当な構文のために警告を出しません。これに対してコンパイル時エラーをトリガーしたいのですが、私の代替案は何ですか?

コピーコンストラクターを宣言することを考えましたが、どこにも定義しないと、使用するとリンク時エラーが発生しますが、どのような状況でもコピーコンストラクターを使用できなくなります。これは望ましいことではありませ

4

2 に答える 2

8

コピーコンストラクタと代入演算子を「private」の下に配置して、iFaceをコピー不可にします。次に、明示的なCopyメソッドを提供します。

class Type {
public:
  virtual Copy(Type& dest) = 0;
private:
  Type (const Type &) {assert(false)}
  Type & operator=(const Type &)  {assert(false)}
}

また、 boost noncopyableを使用して同じことを行うこともできます(上記のように実装されています)。

したがって、コードをコピーしたい場合は、

Type& type = iface.getType();
Type typeCpy;
type.Copy(typeCpy);

余談ですが、パフォーマンス上の懸念からこれを行っている場合、オプティマイザが一時的なコピーを削除しないことを確信していますか?

于 2011-04-27T21:16:41.463 に答える
-1

ここではポインタを返すのが妥当なようですが、所有権がわかりにくい場合は、参照のラッパーを返すことができます。

struct Class {
    struct Ref {
        Ref(Class& c_) : c(c_) { }
        Class Clone() { return c; }
        // overload -> to provide access to c
      private:
        Class& c;
    };
};

元のクラスは通常どおりコピーできますが、参照は明示的に行う必要があります。私はそのアイデアに熱心ではありませんが(コピーセマンティクスがどのように機能するかを理解していなかったユーザーは、誤ってこれらのいずれかを長すぎたユーザーよりも少ないと思います)、理論的には実行可能です。

于 2011-04-27T21:56:54.790 に答える