c ++字符串数组问题

时间:2009-07-23 08:55:22

标签: c++ arrays string

我只是在学习来自Java背景的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}};
}

显然这只是课程的一部分,所以请不要因为错过'}而对我大喊

当编译器遇到构造函数中的实例化时,

编译器会摇摆不定,吐出这样的错误:


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 = { ...)

的那一行

感谢您一起来看看,非常感谢

7 个答案:

答案 0 :(得分:6)

在C ++ 0x之前,您只能在声明数组时使用聚合初始化器语法(即大括号)。

请注意,此程序会出现类似错误:

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

你必须使用一些乏味的括号语法初始化你的数组,一次一个元素。

答案 1 :(得分: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

答案 2 :(得分:1)

出现的第一个问题是,您需要suitsvalues作为每个对象数组,还是可以在CardDealer的所有实例之间共享?

如果没有,我会将它们设为静态,然后您可以提供您在定义时尝试使用的静态初始化语法。

E.g。

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字符串初始化它们。 e.g:

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时,您只需默认初始化构造函数的初始化列表中的成员。

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()
{
}

答案 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;
    }
}

这样,您的代码就更清晰,更容易理解。

答案 4 :(得分:0)

你可以在构造函数中使用类似的东西删除一些乏味的东西。

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

您可以使用花括号语法初始化C风格的字符串,然后可以将其分配给std :: strings。

您也可以在类中使用C风格的字符串(然后您不需要循环)。

答案 5 :(得分: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"};

这是有效的,因为长套装和值是常数..但实际上,你需要这些作为实例变量吗?在这个例子中,静态套装和静态值就足够了。

答案 6 :(得分:0)

你可以使用boost :: assign:

#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,因为代表卡片和值的数组不会改变,我可能会将它们声明为consts - 我会使用向量作为它们“使用更安全,而不是经典阵列。”