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在堆栈上创建 a 的派生类型——这可以通过工厂函数(当然使用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 回答