我知道我可以通过将类的 operator new
设为私有(private)来防止自定义类及其后代的普通堆分配,但是有什么方法可以防止库的用户调用 std::make_shared
在自定义类(或其后代)上?显然,简单地将类中的 operator new
设为私有(private)并不能阻止它。
请注意,我不想完全阻止以任何方式创建共享指针,因为我仍打算通过调用静态方法为我的自定义类生成 std::shared_ptr
生成器方法,但我仍然想阻止其他人尝试直接在我的类上调用 std::make_shared
。
编辑:
为了解决下面的查询,我的最终目标是一种灵活且可重用的机制,用于从原始指针中提取 shared_ptr。遗憾的是,std::enable_shared_from_this
在继承尤其是多重继承方面不是很友好。
此外,因为我打算将其用作使用 CRTP 的模板类中,这会使子类 T 需要显式创建它从 friend 继承的模板化父类,以便它可以访问其他私有(private)构造函数,这会使事情变得有些复杂。
最佳答案
这不是特定于 std::shared_ptr
,但您可以将构造函数设为私有(private),这样可以强制类的所有实例从您的静态方法中生成。
#include <iostream>
#include <memory>
class Foo {
private:
Foo() = default;
public:
static std::shared_ptr<Foo> make() {
return std::shared_ptr<Foo>(new Foo);
}
};
int main() {
//Foo f1;
//auto f2 = std::make_shared<Foo>();
//above does not work since the constructor is private
auto h = Foo::make();
}
您还可以使用重复数据删除器建议并使用私钥使构造函数在类外部不可访问。
#include <iostream>
#include <memory>
class Foo {
private:
struct FooKey {};
public:
Foo(FooKey) {};
static std::shared_ptr<Foo> make() {
return std::make_shared<Foo>(FooKey{});
}
};
int main() {
//Foo f1{Foo::FooKey{}};
//auto f2 = std::make_shared<Foo>(Foo::FooKey{});
//above does not work since Foo::FooKey is private
auto h = Foo::make();
}
关于c++ - 如何阻止使用 std::make_shared<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015983/