我有一个继承自 enable_shared_from_this 的类。它有shared_ptr
s 到子对象并且有一个“根”对象,所以整个层次结构由 shared_ptr 管理。这样一个对象可以有多个父对象并且可以安全地销毁。
我开始编写一个构造函数,然后我意识到用户应该std::shared_ptr
像我在内部使用的那样管理对象,就像我在一些现有的库中看到的那样,例如 gtkmm。所以我可以做我看到其他人做的事情:隐藏构造函数,并编写一个静态成员函数 create() ,它将 a 返回shared_ptr
给新对象。显然 create() 非常有用,因为没有它我需要调用std::make_shared()
或稍后调用std::shared_from_this()
.
但是我应该隐藏构造函数,为什么?我可以猜到一些很好的理由,例如它强制用户使用 shared_ptr,否则对象会被删除,因此可以保证用户不使用不受 shared_ptr 管理的“孤立”对象。它确保用户不会忘记手动创建 shared_ptr,因为忘记意味着对象被删除,即使它被复制(深拷贝,而不是指针的副本),然后用户很快就会注意到这一点。
另一个有趣的选择是不使用 create() 静态方法,而是使用 add_child() 方法作为创建新对象的唯一方法。这保证了它链接到层次结构。问题:灵活性。如果有人想单独使用一个对象,那是不可能的,除非你派生类。
你会做什么/我应该做什么?隐藏/不隐藏ctor?add_child()
? create()
?