2010-08-01 36 views
1

爲什麼不能在我的構造函數中初始化字符串數組?我收到以下錯誤: 內部編譯器錯誤:Segmentation fault |C++構造函數錯誤。無法初始化字符串數組

在構造函數中的這兩行: suits = {「Clubs」,「Diamonds」,「Hearts」,「Spades」}; 面值= {「Ace」,「2」,「3」,「4」,「5」,「6」,「7」,「8」,「9」,「10」,「Jack」,「Queen 「,「國王」};

class Card 
    { 
     public: 
     Card(int n); 
     Card(string d, string s); 
     int getNumber(); 
     string getDenomination(); 
     string getSuit(); 
     void setNumber(int n); 
     void setDenomination(string d); 
     void setSuit(string s); 
     void printMe(); 
     void compareMe(Card c); 

     private: 
     int number; 
     string denomiation; 
     string suit; 
     string suits [4]; 
     string denominations [13]; 
    }; 


    Card::Card(int n) 
    { 
     suits = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
     denominations = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; 

     int denIndex, suitIndex; 

     denIndex = 51 % 13; 
     suitIndex = 51/13; 

     number = n; 
     denomiation = denominations[denIndex]; 
     suit = suits[suitIndex]; 

    } 
+2

你的bug編譯器的名字是什麼? – jweyrich 2010-08-01 19:11:51

+0

GCC(4.4.1)?... – UncleBens 2010-08-01 22:54:57

+0

你不是試圖初始化它,你試圖分配它,並且該複合語法(大括號內的一堆值)不能用於賦值。 – 2010-08-02 01:22:21

回答

3

使用std::vectorboost::array,你的代碼的簡化例子如下

#include <boost/assign/list_of.hpp> 

#include <boost/array.hpp> 

#include <iostream> 
#include <string> 

class Card 
{ 
public: 
    explicit Card(unsigned n) : 
     _number(n), 
     _suits(boost::assign::list_of("Clubs")("Diamonds")("Hearts")("Spades")), 
     _denominations(boost::assign::list_of("Ace")("2")("3")("4")("5")("6")("7")("8")("9")("10")("Jack")("Queen")("King")) 
    { 

    } 

private: 
    unsigned _number; 
    boost::array<std::string, 4> _suits; 
    boost::array<std::string, 13> _denominations; 
}; 

int 
main() 
{ 
    Card foo(5); 

    return 0; 
} 
+1

這是一個很好的建議,但它並沒有幫助解決手頭的問題,也就是說您不能指定這樣的數組字面量。如果你試圖用矢量做這種事情,你會遇到同樣的問題。 – Ferruccio 2010-08-01 18:57:38

+0

@Ferruccio:不正確,語法被稱爲「初始化列表」,並將在C++ 0x內完全支持。使用std :: vector在這裏仍然是更好的選擇。 – 2010-08-01 20:57:05

+0

拒絕回答 – 2010-08-02 00:34:10

4

您只能在施工,不分配使用文字數組初始化。

int good[3] = { 1, 2, 3 }; // OK 
int bad[3]; 
bad = { 1, 2, 3 }; // not so good 

您必須手動複製陣列(或使用容器像vectorboost::array

5

從您發佈的代碼,我想的是,會員登陸suitsdenominations應該是靜態數據成員,即是他們將始終具有相同的數據,每Card例如

所以我建議你讓他們靜在CPP文件在文件範圍內對它們進行初始化(外類聲明的):

聲明:

class Card 
{ 
    public: 
    Card(int n); 
    Card(string d, string s); 
    int getNumber(); 
    string getDenomination(); 
    string getSuit(); 
    void setNumber(int n); 
    void setDenomination(string d); 
    void setSuit(string s); 
    void printMe(); 
    void compareMe(Card c); 

    private: 
    int number; 
    string denomiation; 
    string suit; 
    static const string suits [4];     // static const 
    static const string denominations [13];  // static const 
}; 

定義:

const string Card::suits[4] = {"Clubs", "Diamonds", "Hearts", "Spades"}; 
const string Card::denominations[13] = {"Ace","2","3","4","5","6","7","8","9","10","Jack","Queen","King"}; 

編輯: 正如羅伯特·S·巴恩斯說,使他們static const甚至更​​好。

希望有所幫助。

+1

這對複雜類型是如何工作的?我知道像'char *'這樣的簡單類型,編譯器獲取數據,將其放入只讀部分,然後將指針設置爲指向它。這是否做了類似的事情,而是在運行時調用'='運算符?不應該聲明爲「靜態常量」? – 2010-08-01 19:16:38

+0

這一個調用數組初始值設定項(爲每個元素調用單參數構造函數),它使用複合初始化語法。沒有複合賦值語法。 – 2010-08-02 01:21:41

+0

+1,套裝和麪值清單並非特定於套牌中的每張牌,而是套牌本身。 – dreamlax 2010-08-02 01:29:22

4

如果你得到一個ICE(內部編譯器錯誤),那麼你真的應該把代碼報告給編寫你的編譯器的人。編譯器應該打印出警告和錯誤,但不是分段錯誤。

相關問題