允许仅传递指向new'ed对象的指针

时间:2012-11-03 22:01:20

标签: c++ c++11

我有抽象类Managee和helper类Wrapper。用于构建Wrapper的Managee指针,然后Wrapper将取得Managee的所有权。我想确保用户始终分配新的Managee。 rvalue-references是否适合这个目标?

包装器定义:

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

包装用法:

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

1 个答案:

答案 0 :(得分:3)

Rvalue-references不提供帮助,因为&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,请参阅here

然而,最好的解决方案甚至不允许用户在堆栈上创建Managee派生类型 - 这可以通过工厂函数完成(当然用{ {1}})并使构造函数成为私有的:

std::unique_ptr