通过std::shared_ptr强制对象
enforcing objects through std::shared_ptr
我有一个设计问题。在我的应用程序中,我有几个类要用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获得的原始指针,但意外地这样做是不可能的)。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 唯一 ptr 将所有权移动到包含对象的方法
- 如何传递容器、ptr 和对象不可修改的unique_ptrs容器?
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- 使针对特定托管对象的所有共享 ptr 失效
- ptr<Node> a = 创建对象 < 节点 > ();
- 一个唯一的ptr类如何将它的实例指针传递给它的成员对象
- 从基类ptr的vector对象中擦除
- openv Ptr类.指针对象在调用函数后被删除
- 共享 PTR - C++ 如何使用引用计数管理对象缓存
- 当可以在类对象超出范围之前删除此数据时,类允许访问其数据(通过 ptr/it)是否设计不好
- c++类的析构函数包含ptr到对象的数组
- 如何使用c++ Mat类ptr对象的基本C包装器打印Mat元素?
- 共享Ptr与普通Ptr:声明后的对象创建