2

例如,假设我有以下代码;

class Foo
{
    public:
    Foo(int x) : _foo(x)
    {

    }

    private:
    int _foo;

    protected:
    std::string _bar;
};

class Bar : public Foo
{
    public:
    Bar() : Foo(10), _temp("something"), _bar("something_else")
    { 

    }
    private:
    std::string _temp;
};

int main()
{
    Bar stool;
}

代码没有运行,因为 _bar 属于 Foo 类并且它似乎不知道它存在,所以这不是你将要如何去做的吗?或者你会在 Foo 的构造函数中有 _bar 吗?这会起作用,但如果 _bar 并不总是必须被分配一些东西怎么办?

编辑:下面是我使用的真实代码;

Entity::Entity(GameState *state, bool collidable) 
    :_isLoaded(false), _state(state), alive(true), collidable(collidable),               name(entityDetault)

{

}

Entity::Entity(GameState *state, bool collidable, entityName _name)
    :_isLoaded(false), _state(state), alive(true), collidable(collidable), name(_name)
{

}

然后子类将使用此构造函数;

Player::Player(GameState *state) 
: Entity(state,true,entityName::entityPlayer), health(100),bulletSpeed(600),_colour(sf::Color(128,255,86,255))

现在这一切看起来都正确吗?比在构造函数主体中完成所有操作要好一些。

4

4 回答 4

5

类的构造函数中的成员初始化器列表C只能初始化:

  • 的直接基类C
  • 的直接成员C
  • 的虚拟基类C (不经常出现)

初始化基类成员的唯一方法是通过基类的构造函数。C或者只是放弃初始化,然后在构造函数的主体中进行赋值。但是,后者不能用于const成员或引用,并且通常与初始化不同。

于 2013-03-23T14:51:12.447 回答
2

您可以将它从初始化列表移动到正文(如果它不是 const):

Bar() : Foo(10), _temp("something")
{
    _bar = "something_else";
}

或提供第二个(可能受保护的)承包商Foo

class Foo
{
public:
    Foo(int x) : _foo(x)
    {

    }

protected:
    Foo(int x,std::string s) : _foo(x), _bar(s)
    {
    }

private:
    int _foo;

protected:
    std::string _bar;
};

class Bar : public Foo
{
public:
    Bar() : Foo(10,"something_else"), _temp("something")
    { 

    }

private:
    std::string _temp;
};
于 2013-03-23T14:52:19.890 回答
1

您需要先初始化基类,然后才能访问它。如果要在基类中初始化成员变量,则必须通过调用基类构造函数来初始化它的成员。

于 2013-03-23T14:51:18.697 回答
1

您可以放入_bar'Foo构造函数的初始化列表。如果_bar并不总是需要分配一些东西,你可以使用默认值。

class Foo
{
public:
   Foo(int x):_foo(x)
   {
   }
protected:
   Foo(int x, string s) : _foo(x),_bar(s)
   {

   }

private:
   int _foo;

protected:
   std::string _bar;
};

class Bar : public Foo
{
public:
   Bar() : Foo(10,"something else"), _temp("something")
   { 

   }
private:
  std::string _temp;
};
于 2013-03-23T14:52:52.267 回答