有关初始化列表C ++的问题

时间:2013-03-23 14:46:42

标签: c++

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

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 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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;
};

答案 2 :(得分:1)

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

答案 3 :(得分: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;
};