哪个是初始化基类成员变量的更好的地方?

时间:2012-04-03 14:47:54

标签: c++

class A // abstract class
{
protected:
    int m_iA;
    int m_iB;
    int m_iC;
    int m_iD;
    int m_iE
    ~A();
};

class B : public A // abstract class
{
protected:
    double m_dA;
    double m_dB;
    double m_dC;
    double m_dD;
    ~B();
};

class C : public B
{
public:    
    C(int iA, int iB, int iC, int iD, int iE, double dA, double dB, double dC, double dD)
    {

    }
}

问题>正如您在上面的示例中所看到的,基类AB都包含许多成员变量。将这些初始值从类C传递到基类的更好的解决方案是什么?

方法1>直接在类C的构造函数体内分配基类成员变量。

方法2>将所有初始值从C的构造函数传递到B,最后传递到A

谢谢

5 个答案:

答案 0 :(得分:5)

我建议为A和B创建构造函数,让它们获取初始化值,然后应用它们。然后C调用B的构造函数,将值传递给它,依此类推。这样,如果有另一个继承自B或A的类,它将遵循相同的模式,并且可以通过仅具有需要初始化值的构造函数来强制执行。

答案 1 :(得分:2)

为获取初始化值的基类创建构造函数,并在C的构造函数初始化列表中使用它们。

答案 2 :(得分:2)

使用C ++ 11,您可以获得比预期更少的开销:

class A { // abstract class
protected:
    int m_iA;
    int m_iB;
    int m_iC;
    int m_iD;
    int m_iE
    A(int iA, int iB, int iC, int iD, int iE)
      : m_iA(iA), m_iB(iB), m_iC(iC), m_iD(iD), m_iE(iE) {}
    ~A();
};

class B : public A { // abstract class
protected:
    double m_dA;
    double m_dB;
    double m_dC;
    double m_dD;    
    B(int iA, int iB, int iC, int iD, int iE, double dA, double dB, double dC, double dD)
      : A(iA,iB,iC,iD,iE), m_dA(dA), m_dB(dB), m_dC(dC), m_dD(dD) {}
    ~B();
};

class C : public B {
public:
    using B::B;
}

答案 3 :(得分:1)

更好的想法是采用包含初始化值的tuplearray或自定义结构,然后在B和A的构造函数中解压缩。然后C的构造函数只需要两个对象。

答案 4 :(得分:0)

首先拥有如此长的构造函数是......不是优选的,但无论如何:无论哪种方式同样有效,我会说这是个人选择的问题。