在编译时验证对象是否创建为shared_ptr
Verify at compile time that objects are created as shared_ptr
我编写的一些类(通常作为boost::asio
的一部分)的对象依赖于封装在shared_ptr
中,因为它们使用shared_from_this()
。如果对象没有在shared_ptr
中实例化,有没有办法防止它被编译?
所以,我要找的是:
std::shared_ptr<MyClass> a = std::make_shared<MyClass>(); // should compile fine
std::unique_ptr<MyClass> a = std::make_unique<MyClass>(); // compile error
MyClass a; // compile error
将其构造函数设为私有,并为其提供一个创建shared_ptr
的静态工厂成员函数。别忘了在评论中记录你的设计决定!
// Thing that foos the bar
struct Foo : std::enable_shared_from_this<Foo>
{
// Returns a shared_ptr referring to a new instance of Foo
static std::shared_ptr<Foo> CreateShared()
{
return std::shared_ptr<Foo>(new Foo);
}
private:
// To avoid bugs due to the shared_from_this base,
// we restrict Foo creation to being via CreateShared().
Foo() = default;
};
(我无法想象std::make_shared
会因为私有ctor而工作,但你可以尝试一下。)
不过,我不得不说,这听起来不像是一个班级应该承担的责任。这是一种向后编程。
偷埃尔杰的话:
通常,如果对象包含在shared_ptr、堆、堆栈、指针、向量、数据成员或全局中,则最好(如果可能的话)对象不具有自我意识。一旦他们意识到自己的生命周期是如何管理的,他们就会变得更加受限。毫无必要。
shared_from_this
(可以说)是一种反模式。但是有时它可能是一种必要的反模式。
我更喜欢避免使用enable_shared_from_this
,让人们使用他们认为合适的Foo
,比如通过一个非常瘦的unique_ptr
。
相关文章:
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理