2013-06-01 19 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罰款(我猜甚至更早的版本)