我的构造函数会以某种方式被忽略。这是我的代码:
我的课程:
class field
{
private:
char PlayField[5][5];
public:
char o = 'o';
field()
{
char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
}
void setTile(int x_val, int y_val)
{
PlayField[x_val][y_val] = 'x';
}
char getTile(int x_val, int y_val)
{
return PlayField[x_val][y_val];
}
/*field::~field();*/
};
构造函数field()应该使用'o'将我的4胜利字段初始化,如果我想添加一个Tile,它将标记该tile的位置。 但是如果我做的话
int main()
{
char x;
field FourWins;
//FourWins.setTile(3, 2);
x = FourWins.getTile(3, 2);
std::cout << x << std::endl;
return 0;
}
构造函数将被忽略,我得到一个标志,这很可能只是目前在我正在寻找的地方。 位置查找工作,因为如果我第一次设置和x到(3,2)它将打印我x。
有什么想法吗?
答案 0 :(得分:1)
您使用的char[][]
的初始化语法是允许的,但仅限于构造 - 而不是赋值(并且您的示例构造一个新变量而不是已分配成员变量)。至少用C ++ 14你可以这样做:
class field
{
private:
char o = 'o';
char PlayField[5][5];
public:
field() : PlayField{{ o, o, o, o, o }, { o, o, o, o, o },
{ o, o, o, o, o }, { o, o, o, o, o },
{ o, o, o, o, o }}
{}
};
请考虑使用std::vector
的{{1}}或std::vector
的{{1}}。与std::array
相比,使用std::array
的唯一不利方面是,在编译时必须知道大小(在您的情况下是5x5)(就像在您的示例中一样)
std::array
您用于数组初始化的语法很好,只要确保不指定 new 变量(如果您要启动现有变量)。
答案 1 :(得分:1)
您所犯的错误是,您定义了PlayField两次:
class field
{
private:
char PlayField[5][5];
^^^^^^^^ class attribute
public:
char o = 'o';
field()
{
char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
^^^^ this 'char' made a second PlayField local! a common mistake
}
因此,它只初始化本地数组,而不是类属性。
不幸的是 - 据我所知 - 除了使用两个for循环之外,没有办法显式初始化一个数组:
for(int x=0;x<5;x++)
for(int y=0;y<5;y++)
PlayField[x][y]=o;
最后,你的构造函数没有被忽略,它没有你想要的效果: - )
答案 2 :(得分:0)
您无法像这样为数组赋值。您正在构造函数中定义局部变量。您可以在构造函数中执行此操作。
for(int i = 0; i < 5; i++){
for (int j = 0; j < 5; ++j) {
PlayField[i][j] = o;
}
}
答案 3 :(得分:0)
正在调用构造函数,但未初始化CharField
成员。相反,它正在创建一个名为CharField
的本地数组(虽然名称相同,但与名为CharField
的结构成员不同),初始化它,并且当构造函数完成时该数组不再存在。
构造函数实现
field()
{
char PlayField[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
}
与
具有完全相同的效果(不会将名为CharField
的结构成员更改)
field()
{
char unused_data[5][5] = { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } };
}
唯一改变的是在构造函数体中创建的临时数组的名称。
要实际初始化PlayField
成员,请更改此构造以使用初始化列表
field() : PlayField { { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o }, { o, o, o, o, o } }
{ // body of constructor is here
};
或(在C ++ 11之前),不支持此表单。
field()
{
for (int i = 0; i < 5; ++i)
for (int j = 0; j < 5; ++j)
CharField[5][5] = o;
};