通过std :: shared_ptr强制执行对象

时间:2013-04-24 17:26:41

标签: c++ c++11

我遇到了设计问题。在我的应用程序中,我有几个要使用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关系。有没有办法为此目的定义这样的基类?

提前致谢。

2 个答案:

答案 0 :(得分:3)

  

我不想创建friend关系。

为什么不呢?为什么拒绝一个有效的解决方案?

如果您希望其他课程对私人/受保护成员有特殊访问权限,那么它需要从您的课程派生(不是您班级的基础),或者需要成为您班级的朋友。

我假设您打算在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>();
  }
};

答案 1 :(得分:0)

您无法实例化shared_ptr<make_sharable_only>,因为make_sharable_only::~make_sharable_only是私有的。你可以保持构造函数私有并使析构函数公开(好吧,有人可以删除从shared_ptr获得的原始指针,但不太可能这样做)。