2

我有一个继承自 enable_shared_from_this 的类。它有shared_ptrs 到子对象并且有一个“根”对象,所以整个层次结构由 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()?

4

1 回答 1

1

在一般情况下,没有一个正确的答案。您可以从编写所有这些方法开始:构造函数、create() 和 create_child(),它们都是公共的。然后,在使用接口时,最好是在测试它时(如果可能的话,在你在“真实”代码中使用它之前完成它),检查不同构造选项的可能副作用、结果和便利性,并决定什么是对于您的特定用例,最好,什么是安全的。

当然,如果所有人都安全,您可以将这三个人都公开。否则,通过将它们设为私有(或者可能是受保护的,如果它是要派生的类的构造函数)来隐藏不安全的,并将安全的公开以供用户使用。

于 2013-02-12T22:56:57.200 回答