我遇到了设计问题。在我的应用程序中,我有几个要使用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
关系。有没有办法为此目的定义这样的基类?
提前致谢。
答案 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获得的原始指针,但不太可能这样做)。