0

我用整数和很多布尔成员编写了一个简单的 Actor 类:

这是 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){}

...

那是来自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();

这编译没有任何错误,

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

现在,如果我将初始化列表中的所有布尔值放入注释 (//,left(false)) 并让 gcc 编译所有内容,程序运行完美!

怎么了?我认为最好通过初始化列表来初始化所有类成员。

这可能是一个 g++ 错误吗?

我已经尝试过使用 left() 而不是 left(false)。不:我没有在任何地方的程序中使用 new- 或 *- 运算符!

4

1 回答 1

0

首先,“我一开始就遇到了一个奇怪的段错误”甚至还没有接近错误描述。所以请发布确切的错误。另外,既然您说“在 gcc 中发现了一个错误”,那么 gcc 目前是 4.8 版。所以除非你告诉你正在使用哪个编译器和那个编译器的版本,否则调试是没有用的。

其次,当您有继承并希望在基类部分和/或某些成员初始化上有一些特殊行为时,初始化列表很有用。如果您的类中有对象具有重型构造函数和相应的重型复制构造函数和 operator=,它也很有用,在这种情况下,您可以在初始化程序列表中调用所需的构造函数并保存在构造函数代码中进行复制,否则,首先将创建对象,然后您必须进行一些初始化。

第三,对于 POD 类型,除非你有一些奇怪的继承问题,否则在构造函数代码中进行赋值应该没问题。

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

于 2013-06-01T22:50:25.800 回答