我只是在学习来自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 = {
...)
感谢您一起来看看,非常感谢
答案 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)
出现的第一个问题是,您需要suits
和values
作为每个对象数组,还是可以在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 - 我会使用向量作为它们“使用更安全,而不是经典阵列。”