というクラスfoo
から継承する というクラスがあるとしbar
ます。
のstd::unique_ptr
インスタンスがfoo
あり、それを のみを取る関数に渡したいですstd::unique_ptr<bar>
。関数で機能するようにポインターを変換するにはどうすればよいですか?
std::unique_ptr<foo>
右辺値を次のように変換できますstd::unique_ptr<bar>
。
std::unique_ptr<foo> f(new foo);
std::unique_ptr<bar> b(std::move(f));
明らかに、ポインタはによって所有され、破棄されるb
場合b
はデストラクタbar
が必要です。virtual
継承のため、特別なことは必要ありません。std::move
unique_ptr を関数に渡すために使用する必要がありますが、これは型が一致する場合でも当てはまります。
#include <memory>
struct A {
};
struct B : A {
};
static void f(std::unique_ptr<A>)
{
}
int main(int,char**)
{
std::unique_ptr<B> b_ptr(new B);
f(std::move(b_ptr));
}
次の構文を使用できます。
std::unique_ptr<parent> parentptr = std::unique_ptr<child>(childptr);
または、 を使用することもできますstd::move
。
他のオプションは、生のポインターを発行することですが、関数を変更する必要があります。
void func(const parent* ptr)
{
// actions...
}
func(*childptr);
これは、スマート ポインターとそれを関数に渡すことに関する良い記事です: http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters。
最も基本的なルールに違反するため、できません。unique_ptr
指定されたポインターを保持するインスタンスは 1 つだけである必要があり、そのポインターのunique_ptr
完全な所有権を持ちます (スコープ外になると、ポインティング先は削除されます)。
unique_ptr<T>
とunique_ptr<U>
(ここでU : T
) は互換性がありません。
shared_ptr
複数のインスタンスを持つことができる の場合、 はとstd::static_pointer_cast
同じように動作しますstatic_cast
が、 を受け入れてshared_ptr
別のインスタンスを返す (両方が同じオブジェクトを指している) 点が異なります。
絶対に a を使用する必要がある場合は、最初に現在のものを否認し、そのポインターを正しい型の新しいものに入れるunique_ptr
関数を作成する必要があります。unique_ptr
関数呼び出しの後に逆の変換を行う必要がある場合もあります。