0

抽象クラス Managee とヘルパー クラス Wrapper があります。Wrapper の構築に使用される Managee へのポインタ。Wrapper は Managee の所有権を取得します。ユーザーが常に新しいManageeを割り当てるようにしたい. 右辺値参照はこの目標に適していますか?

ラッパーの定義:

...
Wrapper(Managee * && tmpptr);
Managee & GetManagee();
...

ラッパーの使用法:

Wrapper a(new ManageeA()); // ok;
Wrapper b(&a.GetManagee()); // error?    <-----
4

1 に答える 1

3

は右辺値であるため、右辺値参照は役に立ちません&a.GetManagee()。なぜ取らないのstd::unique_ptrですか?

Wrapper(std::unique_ptr<Managee> ptr)
  : member_ptr(std::move(ptr)) {}

Managee& GetManagee();

使用法:

Wrapper a(make_unique<Managee>(/*args*/));

についてはこちらmake_uniqueをご覧ください

ただし、最善の解決策は、ユーザーがスタック上に の派生型を作成することさえ許可しないことManageeです。これは、ファクトリ関数 (もちろん を使用std::unique_ptr) とコンストラクターを非公開にすることで実行できます。

class SomeClass : public Managee{
public:
  static std::unique_ptr<SomeClass> create(){
    return make_unique<SomeClass>();
  }
private:
  SomeClass(){}
  // other ctors
};
于 2012-11-03T22:15:53.080 に答える