我想安排一些事情,对于Foo类来说,这是有用的:
Foo *f = new Foo()
但这不是(最好是编译时错误):
Foo f;
可以这样做吗?
具体原因是Foo实际上是一个跟踪类,可以使另一个堆分配的对象出现在脚本环境中。 Foo的内部保持从脚本引用到C ++对象的映射。跟踪对象将使用如下:
Thing *t = new Thing();
(new FooThing(t))->PushToScriptStack();
如果跟踪对象在堆栈上,则指针在范围结束时变为无效,并且我在跟踪数据中留下了悬空指针。
我所有这些都运作良好,我只是想寻求一些额外的保护。
答案 0 :(得分:5)
使构造函数为private,有一个create(),它将在堆上分配对象的实例并返回一个指针。你必须自己处理释放。
例如:
Foo *f = Foo::create();
以后:
Foo::destroy(f);
答案 1 :(得分:2)
我知道你已经接受了答案,但无论如何......
Scott Meyer的“更有效的C ++”第27项对此进行了介绍。
他说你可以通过将构造函数设为私有来实现,但这可能有点麻烦,因为你必须确保所有构造函数都是私有的。除了可能添加新构造函数并忘记将其设置为私有之外,还必须考虑编译器生成的构造函数。 Meyers认为将析构函数设为私有更容易,因为只有其中的那些,但当然这有其自身的含义。
如果你还没有,我衷心推荐这本书(我想是由迈耶斯写的任何东西。)