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

时间:2011-03-22 01:25:08

标签: c++

我想安排一些事情,对于Foo类来说,这是有用的:

Foo *f = new Foo()

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

Foo f;

可以这样做吗?

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

Thing *t = new Thing();
(new FooThing(t))->PushToScriptStack();

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

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

2 个答案:

答案 0 :(得分:5)

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

例如:

Foo *f = Foo::create();

以后:

Foo::destroy(f);

答案 1 :(得分:2)

我知道你已经接受了答案,但无论如何......

Scott Meyer的“更有效的C ++”第27项对此进行了介绍。

他说你可以通过将构造函数设为私有来实现,但这可能有点麻烦,因为你必须确保所有构造函数都是私有的。除了可能添加新构造函数并忘记将其设置为私有之外,还必须考虑编译器生成的构造函数。 Meyers认为将析构函数设为私有更容易,因为只有其中的那些,但当然这有其自身的含义。

如果你还没有,我衷心推荐这本书(我想是由迈耶斯写的任何东西。)