2009-07-23 62 views
1

我剛剛學習來自Java背景的C++。C++字符串數組問題

只是玩弄簡單的類了,但由於某些原因,下面將無法編譯,當相同的語法編譯別處罰款:

class CardDealer { 

    private: 
     string suits[4]; 
     string values[13]; 
     bool cardTaken[4][13]; 
     int getRand(int top); 
     void getValidSuit(int *suit); 
     void getValidCard(int suit,int *value); 

    public: 
     CardDealer(); 
     string dealCard(); 
     void resetDeck(); 
}; 

CardDealer::CardDealer(){ 
    suits = {"hearts", "clubs", "spades", "diamonds"}; 
    values = {"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"}; 
    cardTaken = {{false,false,false,false,false,false,false,false,false,false,false,false,false},{false,false,false,false,false,false,false,false,false,false,false,false,false}, 
    {false,false,false,false,false,false,false,false,false,false,false,false,false},{false,false,false,false,false,false,false,false,false,false,false,false,false}}; 
} 

顯然這僅僅是一個類的一部分,所以請不要「T衝我嚷嚷失蹤'}的

編譯夾頭搖晃,當它擊中在構造函數中實例化,吐出來的錯誤這樣的:


1>.\CardDealer.cpp(26) : error C2059: syntax error : '{' 
1>.\CardDealer.cpp(26) : error C2143: syntax error : missing ';' before '{' 
1>.\CardDealer.cpp(26) : error C2143: syntax error : missing ';' before '}' 
1>.\CardDealer.cpp(27) : error C2059: syntax error : '{' 
1>.\CardDealer.cpp(27) : error C2143: syntax error : missing ';' before '{' 
1>.\CardDealer.cpp(27) : error C2143: syntax error : missing ';' before '}' 
1>.\CardDealer.cpp(28) : error C2059: syntax error : '{' 

第26行是一個在那裏我已經實例化的西裝(suits = { ...)

感謝考慮看看球員大加讚賞

回答

6

在C++ 0x之前,只能在聲明數組時使用聚合初始化程序的語法(即大括號)。

請注意,此程序會產生類似的錯誤:

int thing[4]; 
int main() 
{ 
    thing = { 0, 1, 2, 3 }; 
} 

你有幾分單調乏味的括號語法來初始化數組,每次一個元素。

0

因爲我們不知道你的整個源文件,我們不知道什麼是26,27,28行。 我在猜測代碼:

cardTaken = {{false,..... 

引發了這些錯誤。而不是很長的初始化,您可以使用:

for(int i = 0; i<4; i++) 
{ 
    for(int j = 0; j<13; j++) 
    { 
     cardTaken[i][j] = false; 
    } 
} 

這樣一來,你的代碼更清晰,更容易理解。

+0

對不起,不清楚,第26行是我已經實例化'西裝'。爲了清晰起見編輯過的文章 – 2009-07-23 09:06:56

4

我已經改正了以前的職位:

你可以初始化他們這樣的類外:

namespace CardDealer 
{ 
    static const string suits[] = {"hearts", "clubs", "spades", "diamonds"}; 
    static const string values[]={"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"}; 

    class CardDealer 
    {  
    private: 
     bool cardTaken[4][13]; 
     ... 
    }; 

    ... 
} 

在構造函數中,你可以在一個循環中初始化cardTaken

+0

我剛剛嘗試了上面的內容,但編譯器給出了相同的錯誤。無論如何感謝 – 2009-07-23 09:09:59

+3

只有整型成員才能在類定義中初始化。 – CiscoIPPhone 2009-07-23 09:26:41

+0

你是什麼意思的一個組成成員?如在一個整數?或其他完全... – 2009-07-23 09:32:15

0

你可以在你的構造函數中使用類似這樣的東西去除一些乏味。

const char* tempSuits[] = {"hearts", "clubs", "spades", "diamonds"}; 
for(int i=0; i<4; ++i) suits[i] = tempSuits[i]; 

您可以使用大括號語法來初始化C樣式的字符串,然後您可以將它分配給std :: strings。

你也可以在你的類中使用C風格的字符串來開始(然後你不需要循環)。

0

簡單的解決方案:

class CardDealer { 

    private: 
     const string suits[4]; 
     const string values[13]; 
     bool cardTaken[4][13]; 
     int getRand(int top); 
     void getValidSuit(int *suit); 
     void getValidCard(int suit,int *value); 

    public: 
     CardDealer(); 
     string dealCard(); 
     void resetDeck(); 

    private: 
     static string suits_initializer[4]; 
     static string values_initializer[13]; 
}; 


CardDealer::CardDealer(){ 
    memcpy(suits, suits_initializer, sizeof(suits)); 
    memcpy(values, values_initializer, sizeof(values)); 
    memset(cardTaken, 0, sizeof(cardTaken)); 
} 

string CardDealer::suits_initializer[4] = {"a","b","c","d"}; 

這個工作,只要西裝和值是恆定的。但事實上,你需要這些實例變量?靜態套裝和靜態值對於您來說已經足夠了,在這個例子中。

1

出現的第一個問題是,你需要suitsvalues是每個對象數組還是可以在所有CardDealer實例之間共享?

如果沒有,我會讓它們成爲靜態的,然後你可以提供你正在嘗試使用的靜態初始化語法。

例如

class CardDealer { 

    private: 
     static const std::string suits[4]; 
     static const std::string values[13]; 

    // ... 
}; 

,並在其他地方使用.cc/.cpp文件:

const std::string CardDealer suits[4] = { "hearts", " ... ", ... }; 
const std::string CardDealer values[13] = { "ace", " ... ", ... }; 

如果他們確實需要爲每類和這些都只是一些初始值,那麼我寧願讓他們的矢量的字符串從一些靜態分配的C字符串初始化它們。例如: -

class CardDealer { 

    private: 
     static const char* init_suits[4]; 
     static const char* init_values[13]; 

     std::vector<std::string> suits; 
     std::vector<std::string> values; 

    // ... 
}; 

CardDealer::CardDealer() 
    : suits(init_suits, init_suits + sizeof init_suits/sizeof init_suits[0]) 
    , values(init_values, init_values + sizeof init_values/sizeof init_values[0]) 
{ 
} 

const char* CardDealer::init_suits[4] = { ... }; 
const char* CardDealer::init_values[13] = { ... }; 

至於你cardTaken陣列,爲0轉換爲false你可以在構造函數的initalizer列表默認初始化成員。

CardDealer::CardDealer() 
    : suits(init_suits, init_suits + sizeof init_suits/sizeof init_suits[0]) 
    , values(init_values, init_values + sizeof init_values/sizeof init_values[0]) 
    , cardTaken() 
{ 
} 
0

您可以使用boost ::分配:

#include <string> 
#include <vector> 
#include <boost/assign.hpp> 
#include <boost/assign/list_of.hpp> 
#include <boost/assign/std/vector.hpp> 

const std::vector<std::string> my_vector_of_strings = 
boost::assign::list_of("cat")("dog")("banana")("apple")(orange)("tuna")("salmon")("dinosaur")("blablabla")("...")("etc")("etc")("etc"); 

的有趣的事情是,你可以聲明STL容器爲使用這個有用的庫consts,因爲代表卡和價值觀不改變你的陣列,我可能會將它們聲明爲常量 - 我會使用矢量,因爲它們更安全,而不是經典的數組。