C++ 在C+中初始化类构造函数中的2D数组+;

C++ 在C+中初始化类构造函数中的2D数组+;,c++,arrays,C++,Arrays,我在头文件中定义了一个二维数组 char map[3][3]; 如何像这样初始化类构造函数中的值 map = {{'x', 'x', 'o'}, {'o', 'o', 'x'}, {'x', 'o', 'x'}}; 或 首先,赋值和初始化是有区别的。OP标题是关于初始化的 其次,您没有告诉我们您的2D数组是类成员(静态/非静态)还是名称空间变量 -既然您提到在类构造函数中初始化它,我假设它是类非静态成员,因为: $12.6.2/2-“除非 mem初始值设定项id

我在头文件中定义了一个二维数组

char map[3][3];
如何像这样初始化类构造函数中的值

 map = {{'x', 'x', 'o'},
       {'o', 'o', 'x'},
       {'x', 'o', 'x'}};


首先,赋值和初始化是有区别的。OP标题是关于初始化的

其次,您没有告诉我们您的2D数组是类成员(静态/非静态)还是名称空间变量

-既然您提到在类构造函数中初始化它,我假设它是类非静态成员,因为:

$12.6.2/2-“除非 mem初始值设定项id命名 构造函数的类,一个非静态数据 构造函数类的成员,或 直接或虚拟的基础 类,则mem初始值设定项为 格式不正确。”

此外,从C++03开始,对于OP中的情况(不确定C++0x),无法在构造函数初始值设定项列表中初始化成员数组

-如果2D数组是类的静态成员,则应该像初始化一样初始化它(稍作更改),但不能在构造函数中初始化。这应该在封闭的命名空间范围内完成一次,并且在任何转换单元中只能完成一次

char (A::map)[3][3] = {{'x', 'x', 'o'}, 
       {'o', 'o', 'x'}, 
       {'x', 'o', 'x'}};
-或者,如果2D数组是名称空间范围变量,则应将数组的定义从头文件中删除(除非它也是静态的),因为它将导致重新定义错误,并在任何转换单元中定义和初始化一次(也只有一次)

char map[3][3] = {{'x', 'x', 'o'}, 
       {'o', 'o', 'x'}, 
       {'x', 'o', 'x'}}; 

你真的试过你的代码吗?这是一个静态常量数组、静态变量数组还是类成员?
chartmp[]=“xxoooxoxx”;char*map[3]={tmp+0,tmp+3,tmp+6}@rwong一旦tmp数组被销毁,您的映射将具有无效指针。@rwong您刚刚创建了一个新数组。这对他班上的数组没有影响。@Michael:我的答案是对PigBen答案的早期版本的回应,该版本已经被编辑掉了。我想指出的是,从
chartmp[3][3]
中获取
tmp
的地址不会给出指向
char
的指针,它会给出指向
char
的指针。对不起,我没有仔细阅读这个问题。这些代码都不起作用。因为初始化初始化列表中的数组是不可能的,所以必须通过构造函数体中的赋值来完成。所以我会称之为“初始化”,即使它不是在创建变量时完成的。更容易维护,更不容易出错!!
char (A::map)[3][3] = {{'x', 'x', 'o'}, 
       {'o', 'o', 'x'}, 
       {'x', 'o', 'x'}};
char map[3][3] = {{'x', 'x', 'o'}, 
       {'o', 'o', 'x'}, 
       {'x', 'o', 'x'}};