gpt4 book ai didi

由 shared_ptr 管理的对象的 C++ 隐藏构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:04 25 4
gpt4 key购买 nike

我有一个继承自 enable_shared_from_this 的类。它有指向子对象的 shared_ptr 并且有一个“根”对象,因此整个层次结构由 shared_ptr 管理。这样一个对象可以有多个父对象并被安全地销毁。

我开始编写一个构造函数,然后我意识到用户应该像我在内部所做的那样使用 std::shared_ptr 管理对象,就像我在一些现有的库中看到的那样,例如 gtkmm。所以我可以做我看到别人做的事情:隐藏构造函数,并编写一个静态成员函数 create() ,它返回一个 shared_ptr 给新对象。显然 create() 非常有用,因为没有它我需要调用 std::make_shared() 或稍后调用 std::shared_from_this()

但是我应该隐藏构造函数吗?为什么?我可以猜到一些很好的理由,例如它强制用户使用 shared_ptr,否则对象将被删除,因此它保证用户不使用不受 shared_ptr 管理的“孤立”对象。并且它确保用户不会忘记手动创建一个 shared_ptr,因为忘记意味着对象被删除,即使它被复制(深复制,而不是指针的拷贝),然后用户很快注意到。

另一个有趣的选择是不使用 create() 静态方法,而是使用 add_child() 方法作为创建新对象的唯一方法。这保证它链接到层次结构。问题:灵 active 。如果有人想单独使用一个对象,那是不可能的,除非你派生类。

你会做什么/我应该做什么?隐藏/不隐藏ctor? add_child()创建()?

最佳答案

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

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

关于由 shared_ptr 管理的对象的 C++ 隐藏构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14803341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com