我见过很多使用的两阶段初始化。理由是从辅助构造函数调用虚函数。但是,我从未见过任何需要这样做的用例。有吗?
问问题
1423 次
3 回答
4
在不支持异常的平台上,或者由于异常处理导致代码大小增加是不可接受的,两阶段初始化允许您将可能失败的活动放在辅助构造函数中。
于 2012-09-29T15:10:18.390 回答
3
不,这从来都不是不可避免的。
在最坏的情况下,这只是调用一个构建器函数(它可以由运行时机制选择)返回一个围绕对象的可选包装器。
在 C++11 中,使用可移动类型,甚至不需要动态分配,只需返回 aboost::optional<T>
就足够了。
当然,它确实从直接调用构造函数变为调用构建器函数/工厂。但我更喜欢额外的负担,而不是任何一天的两阶段初始化。因为那样我没有得到任何部分对象!
于 2012-09-29T15:54:26.397 回答
0
我看到从其他语言的构造函数中调用的虚函数的一种方式是:
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
必须在构造函数完成后调用 -like 函数,否则BController
将永远不会创建 -like 对象。
可以避免要求显式调用Initialize()
方法,但Initialize()
方法(从也执行 的辅助函数调用new A()
)是更简单的方法之一。
于 2012-09-29T15:10:21.490 回答