用例进行两阶段初始化

时间:2012-09-29 14:50:43

标签: c++ oop

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

3 个答案:

答案 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>