我见过很多两阶段初始化。理由是从辅助构造函数调用虚函数。但是,我从未见过任何必要的用例。有没有?
答案 0 :(得分:4)
在不支持异常的平台上,或者由于异常处理导致的代码大小增加是不可接受的,两阶段初始化允许您在辅助构造函数中放置可能失败的活动。
答案 1 :(得分:3)
不,这绝不是不可避免的。
在最坏的情况下,这只需要一个构建器函数(可以通过运行时机制选择),在对象周围返回一个可选的包装器。
在C ++ 11中,对于可移动类型,甚至不需要动态分配,只需返回boost::optional<T>
即可。
当然,它确实从调用构造函数直接调用构建函数/工厂。但我更喜欢任何一天两阶段初始化的额外负担。 因为我不会那样得到部分对象!
答案 2 :(得分:0)
我看到从其他语言的构造函数调用的虚函数的一种方法是无法在C ++构造函数中完成的:
class AController
{
};
class A
{
private:
// This is only a raw pointer that never gets freed for simplicity
// The real code does ensure it gets freed when appropriate
AController *controller;
protected:
virtual AController *CreateController()
{
return new AController();
}
public:
A()
{
controller = CreateController();
}
};
class BController : public AController
{
};
class B : public A
{
protected:
virtual AController *CreateController()
{
return new BController();
}
};
A
是一个复杂的对象,有几个Controller
- 类子对象(我只包含一个),每个子对象都可以(如果合适的话)从中派生出来。在C ++中,必须在构造函数完成后调用类似CreateController
的函数,否则不会创建BController
类似的对象。
可以避免要求显式调用Initialize()
方法,但Initialize()
方法(从也执行new A()
的辅助函数调用)是更简单的方法之一。 / p>