0

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

提前致谢。

4

2 回答 2

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>();
  }
};
于 2013-04-24T17:43:47.923 回答
0

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

于 2013-04-25T04:50:54.870 回答