私は、次のクラス定義を持っている:C++ unique_ptrを関数に渡しても、多形性の恩恵を受けるにはどうすればよいですか?
class A {...}
class B : public class A {...}
と所有者のクラス定義:
class C {
A* a;
public:
C (A* a) { this->a = a; }
}
私は次のように呼び出すしようとするとその後、すべてが正常である:
B* b = new B();
C(b);
しかし、私は次のオーナークラス定義を持っています:
class C {
std::unique_ptr<A> a;
public:
C(std::unique_ptr<A>& a) { this->a = std::move(a); }
}
そして、私は次のように呼び出すしようとすると、私はの&をunique_ptrをするためにBのunique_ptrをから変換することはできませんと言って、コンパイラのエラーを取得:
std::unique_ptr<B> b(new B());
C(b);
私はそのSTDを実現行い:: &とstd unique_ptrを:: unique_ptrは同じではありません。しかし、私は、標準プロトコルが所有するクラスに一意のポインタを渡すためのものであるかどうかはわかりません。
私は次のことを試してみました:
class C {
std::unique_ptr<A> a;
public:
C(std::unique_ptr<A> a) { this->a = std::move(a); }
}
と
std::unique_ptr<B> b = std::make_unique<B>();
C(std::move(b));
代わりのshared_ptrのunique_ptrを使用しての目的の一部ではないから、その性能向上を得ることですので、これは、動作しますが、カウンター直感的に感じていますメモリアドレスをコピーする必要があります。しかし、この場合、メモリアドレスをコピーするのではなく、新しいunique_ptrを作成して値渡しするだけで、関数が有効範囲外になったらそれを投げることができます。
注:私は変更可能な参照によって独特のポインタを渡さないVS C++コンパイラ11
func関数には、次のように指定します。a unique_ptr:func(a.get()); – sailfish009
ドキュメント(http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique)によると、 'std :: make_unique'はC++ 14です(したがって、既にC++ 14 **機能を使用しています)。そうでなければ、私はC++ 11と14の間で 'std :: unique_ptr'に大きな変化はないと思います。あなたの' C'コンストラクタはおそらく 'C(std :: unique_ptr && a)です:a(std :: move(a)){} 'を実行します。 – Phil1970
@ sailfish009クラスCはポインターの所有権を取って答えがうまくいかないようにする必要があります。 – jahithber