2013-06-01 20 views
0

我写了一个简单的类演员与整数和大量的布尔成员:C++ 11段错误,在初始化列表中的一些布尔变量

下面是来自actor.cpp文件

Actor::Actor()  
:X(0),Y(0),W(14),H(14),speedX(0),speedY(0) 
,left(false),right(false),up(false),North(false), 
East(false),South(false),West(false),NorthEast(false), 
NorthWest(false),SouthEast(false),SouthWest(false){} 

的exerpt ...

而且从actor.h头文件

class Actor 
{ 
private: 
    int X; 
    int Y; 
    unsigned short int W; 
    unsigned short int H; 

    unsigned short int speedX; 
    unsigned short int speedY; 

    bool left; 
    bool right; 
    bool up; 

    bool North; 
    bool East; 
    bool South; 
    bool West; 
    bool NorthEast; 
    bool NorthWest; 
    bool SouthEast; 
    bool SouthWest;  
public:   
    Actor(); 
    ~Actor(); 

这编译没有任何错误那是,

但是如果我运行该程序,我会在开始时遇到一个奇怪的段错误。

现在,如果我把所有的bools放入注释(//,left(false))中并且让gcc编译所有东西,程序就可以完美运行!

出了什么问题?我认为通过初始化列表初始化所有类成员会更好。

难道这是一个g ++的bug?

我已经尝试使用left()而不是left(false)。不,我不在任何地方使用新的或* - 操作符!

回答

0

首先,“我在开始的时候遇到了一个奇怪的段错误”甚至没有接近错误描述。所以请发布确切的错误。此外,既然你说过“在gcc中发现了一个bug”,gcc目前是4.8版本。所以除非你知道你使用的编译器和编译器的版本,否则调试是无用的。其次,初始化列表在继承时很有用,并希望对基类部分和/或某些成员初始化有特殊的行为。如果你的类有一个很重的构造函数和相应繁重的构造函数和operator =的对象,那么它也很有用,在这种情况下,你可以在构造函数代码中调用所需的构造函数,并保存在构造函数代码中,因为否则,首先创建对象,然后你将不得不做一些初始化。第三,对于POD类型,除非你有一些奇怪的继承问题,否则在构造函数代码中做赋值应该没问题。

最后,http://pastebin.com/x5tuvBFw是代码,用文件名和它编译和运行在gcc4.7罚款(我猜甚至更早的版本)