我将设计一个基于虚方法的C++类接口,以便提供可扩展性点。许多这些公共方法需要堆分配对象作为参数。由于我正在使用现代C++模式,计划使用std::unique_ptr或std::shared_ptr来进行这项工作,但我对两者都有疑虑。
如果使用std::unique_ptr,代码看起来会像这样:
强制调用者提供`std::unique_ptr`有一些缺点:
- 调用者不能对提供的用户进行任何操作,因为它必须被移动 - 如果`doSomethingWithUser`的任何实现需要将用户存储在某个容器中,则无法从`std::shared_ptr`构造
对于所有公共方法使用`std::shared_ptr`可以解决问题,但我们必须付出额外的内存空间和引用计数的原子增减的代价。
是否有什么经验法则可以遵循?
如果使用std::unique_ptr,代码看起来会像这样:
class IFoo {
virtual void doSomethingWithUser(std::unique_ptr<User> user) = 0;
}
强制调用者提供`std::unique_ptr`有一些缺点:
- 调用者不能对提供的用户进行任何操作,因为它必须被移动 - 如果`doSomethingWithUser`的任何实现需要将用户存储在某个容器中,则无法从`std::shared_ptr`构造
对于所有公共方法使用`std::shared_ptr`可以解决问题,但我们必须付出额外的内存空间和引用计数的原子增减的代价。
是否有什么经验法则可以遵循?