9

在使用两种不同的方法初始化继承类中的成员数据时,我有一个错误我无法理解,我认为它们在理论上应该是相同的。

class gSolObject
    {
    public:
        gSolObject();
        virtual ~gSolObject(){}
        bool   isCollisionObject;
    };

class gPlanetObject : public gSolObject
    {
    public:
        gPlanetObject();
       ~gPlanetObject(){};
    };

gSolObject::gSolObject():isCollisionObject(1)
            {
            }

gPlanetObject::gPlanetObject():gSolObject(),isCollisionObject(0)
            {
            }

我得到一个错误类gPlanetObject”没有任何名为“isCollisionObject ”的字段。

但是,当我将初始化直接放入构造函数的括号 {..} 中时:

gPlanetObject::gPlanetObject():gSolObject()
            {
            isCollisionObject=0;
            }

它编译得很好。为什么会这样?

编辑:这也不起作用

gPlanetObject::gPlanetObject():gSolObject(),gSolObject::isCollisionObject(0)

它在 '(' token' 之前写入'expected class-name'

4

2 回答 2

12

不能初始化基类中声明的成员变量,因为基类构造函数已经初始化了它们。 所有基本构造函数都在成员构造函数之前执行。

您可以重新分配它。或者您可以调用一个基类构造函数,该构造函数接受一个参数并使用该值初始化其成员。

于 2013-11-12T00:14:29.393 回答
1

已编辑:您不能调用未初始化对象的方法(此处),这就是在构造函数中gSolObject执行时它起作用的原因。isCollisionObject(0)此外,如果您始终将其设置为 0,那么您应该在 gSolObject 构造函数中使用默认值。

于 2013-11-11T23:57:28.927 回答