在派生构造函数中调用基本方法的不良做法?

时间:2011-11-14 03:44:54

标签: c++ oop class methods constructor

我只是想知道设置继承成员的最有效方法是以及如果以下代码可以使用:

这是基类的声明:

class cEntity{
private:
    int X, Y;
    int Height, Width;
public:
    cEntity();
    cEntity(int x,int y,int h,int w);
    ~cEntity();

    void setX(int x){X=x;};
    void setY(int y){Y=y;};
    void setCoords(int x, int y){X=x;Y=y;};

    void setHeight(int h){Height = h;};
    void setWidth(int w){Width = w;};
    void setArea(int h, int w){Height=h;Width=w;};

    int getX(){return X;};
    int getY(){return Y;};
    //void getXY(int,int);

    int getHeight(){return Height;};
    int getWidth(){return Width;};
    //void getArea(int,int);
};

,这是派生类的构造函数:

cOrganism::cOrganism () {
    setCoords(0,0);
    setArea(0,0);
    Name = "UNKNOWN";
    Health = 100;
    MaxHealth = 100;
    HealthHiRange =100;
    HealthLoRange = 100;
};

因此。可以在派生类的构造函数中调用setCoords()setArea()吗?

3 个答案:

答案 0 :(得分:7)

没关系,但你可以通过调用基础构造函数来做得更好:

cOrganism::cOrganism() : cEntity(0, 0, 0, 0) {
  // other stuff
}

实际上,您应该以相同的方式初始化新的派生成员:

cOrganism::cOrganism()
: cEntity(0, 0, 0, 0),
  Name("UNKNOWN"),
  Health(100),
  ...
{
}

(您可能还想了解一般的C ++类设计:如果您将getter和setter暴露给所有私有变量,那么事情就不对了。一个类应该封装一个模型,而你基本上是相反的。但这不是技术错误。)

答案 1 :(得分:1)

更好地称之为:

cOrganism::cOrganism () : cEntity(0,0,0,0) {
  Name = "UNKNOWN";
  Health = 100;
  MaxHealth = 100;
  HealthHiRange =100;
  HealthLoRange = 100;
}

甚至更好:

cOrganism::cOrganism ()
 : cEntity(0,0,0,0), Name("UNKNOWN"), Health(100), 
   MaxHealth(100), HealthHiRange(100), HealthLoRange(100)
{}

这样就可以将基类成员设置为构造基类实现。

答案 2 :(得分:0)

如果基类的默认构造函数已将其初始化为良好值,则不必全部执行此操作。

否则,好的解决方案如下所示。

class A
{
int x;
public:
    A( int xin) :x(xin) {}
};


class B : public A
{
int y;
public:
    B( int xin , int yin ) :A(xin) , y(yin) {}
};

注意B构造函数中的 A(xin)。这将调用pass xin到A构造函数。

如果你有像整数这样的东西,你做什么并不重要。但如果A :: X实际上是一个重量级的物体。使用您的方法,A :: x将使用默认构造函数构造一次,然后在从派生类构造函数调用setCoords()时再次分配。我的解决方案将确保 A :: x *仅构造一次,并且具有所有正确的参数值。

More details here