c++;字符串数组问题 我刚刚学习了来自java背景的C++。

c++;字符串数组问题 我刚刚学习了来自java背景的C++。,c++,arrays,string,C++,Arrays,String,现在只是玩弄简单的类,但由于某些原因,当相同的语法在其他地方可以很好地编译时,以下内容将无法编译: class CardDealer { private: string suits[4]; string values[13]; bool cardTaken[4][13]; int getRand(int top); void getValidSuit(int *suit); void get

现在只是玩弄简单的类,但由于某些原因,当相同的语法在其他地方可以很好地编译时,以下内容将无法编译:

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}};
}
const std::string CardDealer suits[4] = { "hearts", " ... ", ... };
const std::string CardDealer values[13] = { "ace", " ... ", ... };
显然,这只是课堂的一部分,所以请不要因为我错过了“}”而对我大喊大叫

编译器在命中构造函数中的实例化时会发出抖动,抛出如下错误:


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行是我实例化西装的地方(
suites={
…)


感谢大家的关注,非常感谢

因为我们不知道您的整个源文件,我们不知道第26、27、28行中的内容。 我猜代码是:

cardTaken = {{false,.....
引发这些错误。您可以使用以下方法代替冗长的初始化:

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

for(int i=0;i因为我们不知道您的整个源文件,所以我们不知道第26、27、28行中的内容。
我猜代码是:

cardTaken = {{false,.....
引发这些错误。您可以使用以下方法代替冗长的初始化:

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

for(int i=0;i我已经更正了前面的帖子:

你可以在课堂外这样初始化它们:

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];   
        ...
    };

    ...
}

在构造函数中,您可以在循环中初始化卡片。

我已经更正了前面的帖子:

你可以在课堂外这样初始化它们:

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];   
        ...
    };

    ...
}

在构造函数中,可以在循环中初始化
cardstake

直到C++0x,在声明数组时只能使用聚合初始值设定项语法(即大括号)

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

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

在C++0x之前,声明数组时只能使用聚合初始值设定项语法(即大括号),每次只能使用一个元素

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

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

您必须使用有点繁琐的括号语法初始化数组,一次初始化一个元素。

您可以在构造函数中使用类似的方法来消除一些繁琐

const char* tempSuits[] = {"hearts", "clubs", "spades", "diamonds"};
for(int i=0; i<4; ++i) suits[i] = tempSuits[i];
const char*tempfuits[]={“红心”、“梅花”、“黑桃”、“钻石”};

对于(inti=0;i,您可以在构造函数中使用类似的东西来消除一些繁琐的工作

const char* tempSuits[] = {"hearts", "clubs", "spades", "diamonds"};
for(int i=0; i<4; ++i) suits[i] = tempSuits[i];
const char*tempfuits[]={“红心”、“梅花”、“黑桃”、“钻石”};
对于(int i=0;i简单解:

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"};
只要套装和值是常量,这就行。但事实上,您需要这些作为实例变量吗?在本例中,静态套装和静态值就足够了。

简单解决方案:

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"};

只要套装和值是常量,这就行了。但事实上,您需要这些作为实例变量吗?在本例中,静态套装和静态值对您来说已经足够了。

出现的第一个问题是,您需要
套装和
值是每个对象数组,还是它们可以在
C的所有实例之间共享ARD经销商

如果不是,我将使它们成为静态的,然后您可以提供您试图在其定义点使用的静态初始化语法

例如

在.cc/.cpp文件的其他位置:

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}};
}
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] = { ... };

出现的第一个问题是,您是否需要将
套装
作为每个对象数组,或者它们是否可以在
CardDealer
的所有实例之间共享

如果不是,我将使它们成为静态的,然后您可以提供您试图在其定义点使用的静态初始化语法

例如

在.cc/.cpp文件的其他位置:

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}};
}
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] = { ... };

您可以使用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");
#包括
#包括
#包括
#包括
#包括
const std::vector my_vector_of_string=
(猫)(狗)(香蕉)(苹果)(橘子)(金枪鱼)(鲑鱼)(恐龙)(布拉布拉布拉布拉布拉)(布拉布拉布拉布拉)(etc)(etc)(etc)(etc)的列表;

有趣的是,您可以使用这个有用的库将stl容器声明为常量,因为您表示卡片和值的数组不会改变,所以我可能会将它们声明为常量——我会使用向量,因为它们比经典数组更安全。

您可以使用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");
#包括
#包括
#包括
#包括
#包括
const std::vector my_vector_of_string=
(猫)(狗)(香蕉)(苹果)(橘子)(金枪鱼)(鲑鱼)(恐龙)(布拉布拉布拉布拉布拉)(布拉布拉布拉布拉)(etc)(etc)(etc)(etc)的列表;

有趣的是,您可以使用这个有用的库将stl容器声明为常量,因为您表示卡片和值的数组不会改变,所以我可能会将它们声明为常量——而且我会使用向量,因为它们比经典数组更安全。

很抱歉没有说得更清楚,第26行是我实例化
的地方uits
。为Clarity编辑的帖子抱歉,我没有说得更清楚,第26行是我实例化的
suits
。为Clarity编辑的帖子我刚刚尝试了上述方法,但编译器给出了相同的错误。无论如何,谢谢,只有整数成员可以在类定义中初始化。整数成员是什么意思?如整数?或完全其他的东西…是的,整数。这包括bool、char、wchar\u t、有符号和无符号整数类型。我刚刚尝试了上面的方法,但编译器给出了相同的错误。无论如何,谢谢,只有整数成员可以在类定义中初始化。整数成员是什么意思?比如整数?或者其他完全…是的,整数。这包括bool、char、wchar\t、有符号和无符号整数类型。啊,这太糟糕了。初始化时我无法让它工作,所以我不得不走一次一个的路线。你说的对,extremel