5

我见过很多使用的两阶段初始化。理由是从辅助构造函数调用虚函数。但是,我从未见过任何需要这样做的用例。有吗?

4

3 回答 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 回答