7

というクラスfooから継承する というクラスがあるとしbarます。

std::unique_ptrインスタンスがfooあり、それを のみを取る関数に渡したいですstd::unique_ptr<bar>。関数で機能するようにポインターを変換するにはどうすればよいですか?

4

4 に答える 4

27

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

于 2013-08-23T00:49:30.447 に答える
2

継承のため、特別なことは必要ありません。std::moveunique_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));
}
于 2013-08-23T12:53:57.497 に答える
0

次の構文を使用できます。

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

于 2013-08-23T00:51:44.577 に答える
-1

最も基本的なルールに違反するため、できません。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関数呼び出しの後に逆の変換を行う必要がある場合もあります。

于 2013-08-23T00:46:13.757 に答える