例如,假设我有以下代码;
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))
这一切现在看起来都正确吗?比在构造函数体中完成所有操作稍微好一些。
答案 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;
};