【问题标题】:Reference to uninitialized object iniside constructor引用未初始化的对象 iniside 构造函数
【发布时间】:2010-10-22 12:42:01
【问题描述】:

可以将未初始化的对象传递给父类,如下例所示

class C
{
    public:
        C(int i): 
            m_i(i)
        {};

        int m_i;
}

class T
{
    public:
        T(C & c):
            m_c(c)
        {
        };

        C & m_c;
};


class ST : public T
{
    public:
        ST():
            T(m_ci),
            m_ci(999)
        {
        };

        C m_ci;
};

class T 构造函数中,c 是对未初始化对象的引用。如果class T 在构造过程中使用c 对象,这可能会导致错误。但既然不是这样,它可以编译并正常工作。我的问题是——它会破坏某种范式或良好的设计指令吗?如果是这样,有什么替代方案,因为我发现在子类中分配父类所需的对象很有用。

顺便说一句,我想知道为什么不能更改初始化顺序,以便在某些成员初始化后调用基类构造函数。

【问题讨论】:

    标签: c++ constructor reference initialization


    【解决方案1】:

    将引用或指针传递给未初始化的对象在技术上是完全可以的。

    但是您问的原因可能是您认为某些事情很容易出错,通过一些调用链,人们可能会在对象初始化之前无意中访问它。我认为这是一个合理的担忧。还有另一件事可能出错,即基类T 中的代码现在可能通过直接更改ST 实例的数据成员来使ST 的类不变量无效...

    所以,我认为这有点冒险。

    关于初始化顺序,C++ 是基于从部分向上构建的思想,在层次结构中。如果构造函数抛出,那么完全构造的东西会自动被破坏。如果构造顺序更随意,这将更困难或效率更低。

    干杯,

    【讨论】:

      【解决方案2】:

      我已经看到了很多,许多编译器都会发出警告。如果 T 构造函数从不取消引用 c 引用,那也没关系。

      如果您不想要警告,则需要进行两阶段构建。在T 中创建一个受保护的Init(C&) 方法,然后在ST 构造函数主体中调用它——不幸的是m_c 需要一个指针来执行此操作(因为引用不能重新分配给另一个对象)

      【讨论】:

        【解决方案3】:

        可以,但你会得到未定义的行为。

        在 Boost 的实用程序中,您会找到由 R. Samuel Klatchko 创建的 base-from-member idiom。基本上,您在私人成员的位置建立一个私人基地。这个基地首先被初始化,你可以将它用于其他基地:

        // ...
        
        class C_base
        {
        public:
            C_base(int i) :
            m_ci(i)
            {}
        
            C m_ci;
        };
        
        
        class ST :
            private C_base
            public T
        {
            public:
                ST() :
                    C_base(999),
                    T(m_ci),
                {
                };
        };
        

        Boost 的实用程序消除了重复代码。

        【讨论】:

          猜你喜欢
          • 2021-12-26
          • 1970-01-01
          • 2012-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-15
          • 1970-01-01
          相关资源
          最近更新 更多