4

さまざまな派生オブジェクトを生成し、次のように返すはずのこの関数がありますunique_ptr<base>

class base {};  // contains pure functions.
class derived1 {}; // reifies that pure iface.
class derived2 {}; // reifies that pure iface.

unique_ptr<base> factory::load(int param)
  {
    switch (param)
      {
      case PARAM_MAIN:
        return new derived1();
        // return std::move(new derived1());

      case PARAM_2:
        return new derived2();

      case ...:
        return new derived...();

      }
  }

std::move を使用しても、これを実行する方法はありません。(dynamic_cast も使用しましたが、間違っていた可能性があります)。

これは私が得るエラーです: (gcc (GCC) 4.8.1 20130725 (プレリリース) on ArchLinux)

could not convert '(std::shared_ptr<base::model>((*(const std::shared_ptr<base::model>*)(& associatedModel))), (operator new(48ul), (<statement>, ((derived1*)<anonymous>))))' from 'derived1*' to 'std::unique_ptr<base>'
            associatedModel));

自分が何をしたいのかが明確になったことを願っています。

どうすればいいのですか?ありがとう。

4

2 に答える 2

6

std::make_uniqueunique_ptr<derived1>(new derived1());を使用することも、(C++14 を使用する場合) もっと良いこともできます。

using namespace std;

class base {};  // contains pure functions.
class derived1 {}; // reifies that pure iface.
class derived2 {}; // reifies that pure iface.

unique_ptr<base> factory::load(int param) {
  switch (param) {
    case PARAM_MAIN: return make_unique<derived1>();
    case PARAM_2:    return make_unique<derived2>();
    case ...:        return make_unique<derived...>();
  }
}
于 2015-04-04T10:03:16.740 に答える
-7

私はこのように解決しました:

return unique_ptr<base>(dynamic_cast<base*>(std::move(
               new derived1()
       )));

したがって、ポイントはbase、まだ未加工の状態で にアップキャストする必要があり、その後でunique_ptr.

とにかく簡単な答えに感謝します。特に、unique_ptr の内部と実装に基づく推論。

于 2013-08-17T12:17:09.487 に答える