通过std::shared_ptr强制对象

enforcing objects through std::shared_ptr

本文关键字:ptr 对象 std shared 通过      更新时间:2023-10-16

我有一个设计问题。在我的应用程序中,我有几个类要用std::shared_ptr管理。我们希望强制这些类只能由std::shared_ptr创建。因此,我们想这样做:

template <typename T>
class make_sharable_only
{
    make_sharable_only();
    ~make_sharable_only();
public:
    template <typename ...Args>
    static std::shared_ptr<T> CreateShareInstance(Args ...args)
    {
        std::shared_ptr<T> ptr;
        ptr.reset(new T(args...));
        return ptr;
    }
};
    class A: public make_sharable_only<A>
    {
    };
void f()
{
    auto aPtr = A::CreateShareInstance();
}

但是,问题是即使CreateShareInstance也不能创建a的实例,我不想创建friend关系。是否有一种方法可以为此目的定义这样的基类?

我不想创建friend关系。

为什么不呢?为什么要拒绝一个可行的解决方案?

如果你想让其他类对private/protected成员有特殊的访问权限,那么它要么需要从你的类派生(不是你的类的基类),要么需要是你的类的友类。

我假设你在A中有一个私有构造函数。

:

    std::shared_ptr<T> ptr;
    ptr.reset(new T(args...));
    return ptr;
应:

    return make_shared<T>(std::forward<Args>(args)...);

一旦你这样写它,它是如此简单,没有理由尝试使用一个基类,只是把一个工厂函数在A,它只需要三行代码(四行使其成为模板):

class A {
  A() = default;
public:
  static std::shared_ptr<A> create() {
    return std::make_shared<A>();
  }
};

不能实例化shared_ptr<make_sharable_only>,因为make_sharable_only::~make_sharable_only是私有的。您可以将构造函数保留为私有,而将析构函数设置为公共(好吧,有人可能会删除从shared_ptr获得的原始指针,但意外地这样做是不可能的)。