C++:构造函数中的多维数组初始化
C++: multidimensional array initialization in constructor
我想在C++中使用一个大小不变的二维数组作为类成员。不过,我在构造函数中初始化它时遇到了问题。
以下是我的非工作尝试:
1.)
class A {
public:
int a[2][2];
A();
};
A::A() {
a = {{1,2},{2,4}};
}
产量:error: assigning to an array from an initializer list
2.)
class A {
public:
int a[2][2];
A();
};
A::A() {
int b[2][2] = {{1,2},{2,4}};
a = b;
}
产量:invalid array assignment
3.)
class A {
public:
int **a;
A();
};
A::A() {
int b[2][2] = {{1,2},{2,4}};
a = b;
}
产量:cannot convert ‘int [2][2]’ to ‘int**’ in assignment
我有C背景。我知道我可以使用std::vector
,我也知道这种方法的缺点,但由于这对我来说是一个练习,我想知道如何使用普通数组。我应该补充一点,我想稍后处理这个数组。我想更改存储的值,但不想更改大小。也许这也很重要(我认为在合适的地方安装const
可以有所帮助?)。
如果您有C++11,您可以在构造函数定义中使用以下语法:
A() : a{{1,2}, {3, 4}} {}
如果你没有C++11,你将需要坚持邪恶的旧方法:
A() {
a[0][0] = 1;
// etc
}
第一个示例还使用构造函数init列表,该列表应始终用于初始化成员,而不是在构造函数体中初始化它们。
构造函数中的各种多维数组示例:
// int array1[1];
A() : array1{0} {}
// int array2[2][2];
A() : array2{{0}} {}
// int array3[3][3][3];
A() : array3{{{0}}} {}
试试这个,它适用于二维数组(在标准C++中):
class A {
public:
int a[2][2];
A();
};
typedef struct{ int a[4]; } array_t;
A::A() {
int at[2][2] = {{1,2},{2,4}};
*(array_t*)a = *(array_t*)at;
}
CiaoAngelo
您的第一个变体非常接近正确的C++11语法:
A::A()
: a{{1,2},{2,4}}
{
}
补充前面的答案(你们太快了):
正如编译器所说,在情况1和情况2中,您试图做的是array assignment
,这是不允许的;
但我想提请你注意你的第三个案例,这是一个严重的误解,特别是正如你所说的来自C
。
是否将指向局部变量的指针分配给a
?
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理