如何定义一个只能通过new实例化的类(即不在堆栈中)?

Rob*_*b N 1 c++

我想安排一些事情,对于一个类Foo,这是有效的:

Foo *f = new Foo()
Run Code Online (Sandbox Code Playgroud)

但这不是(最好是编译时错误):

Foo f;
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?

具体原因是Foo实际上是一个跟踪类,可以使另一个堆分配的对象出现在脚本环境中.Foo的内部保持从脚本引用到C++对象的映射.跟踪对象将使用如下:

Thing *t = new Thing();
(new FooThing(t))->PushToScriptStack();
Run Code Online (Sandbox Code Playgroud)

如果跟踪对象在堆栈上,则指针在范围结束时变为无效,并且我在跟踪数据中留下了悬空指针.

我所有这些都运作良好,我只是想寻求一些额外的保护.

bra*_*o86 5

使构造函数私有,有一个create(),它将在堆上分配对象的实例并返回一个指针.你必须自己处理释放.

例如:

Foo *f = Foo::create();
Run Code Online (Sandbox Code Playgroud)

然后:

Foo::destroy(f);
Run Code Online (Sandbox Code Playgroud)