从构造函数参数初始化类初始化程序列表中的const多维数组
问题描述:
我有一个包含const 2d值数组的类,我想在调用构造函数时定义这个数组。我被告知使用const
上的值应该永远不会改变是首选,所以我想在这种情况下尝试。从构造函数参数初始化类初始化程序列表中的const多维数组
class A {
public:
A(const int passedArray[2][2]) : memberArray(passedArray) {}
private:
const int memberArray[2][2];
};
const int passedArray[][2] = {
{0,0},
{0,1}
};
A a(passedArray); // fails with "incompatible types
//in assignment of 'const int (*)[2]' to 'const in[2][2]'
A a(&passedArray); // fails
这也失败,const int passedArray[2][2] = ...
,与private: const int** memberArray
等
我知道我必须使用初始化列表,因为构造函数不能改变常量的值。这在C++ 11中完全可能吗?
答
对您的问题的评论有一些很好的信息。
这里之后是工作代码:
//g++ 5.4.0
#include <iostream>
class A {
public:
A(int passedArray[2][2])
{
//USE STD COPY TO COPY THE ARRAYS.
std::copy(&passedArray[0][0], &passedArray[0][0]+4,&memberArray[0][0]);
//PRINT VALUES TO TEST
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
std::cout << memberArray[i][j] << std::endl;
}
}
}
private:
int memberArray[2][2];
};
int main()
{
//INITIALIZE YOUR ARRAY
int passedArray[2][2] = {
{0,0},
{0,1}
};
//CREATE OBJECT
A a(passedArray);
}
如果你的企业需要的是有一个“常量多维数组中的类” 你必须这样做的以下任何一种方式。
class A {
public:
A(const int passedArray[2][2])
{
}
private:
const int memberArray[2][2] = {{5,6},{7,8}}; //INITIALIZE HERE
};
OR
class A {
public:
A(const int passedArray[2][2])
{
}
private:
//DECLARE STATIC HERE
static const int memberArray[2][2];
};
//INTIALIZE HERE
const int A::memberArray[2][2] = {{5,6},{7,8}};
+0
谢谢。我需要这个类的多个实例,所以一个静态常量(或者在没有读取参数的情况下在类中初始化)将不适用于我。我想我只是将它作为一个私有成员数组,而不是const,即使这样会更加正确。 – jeremysprofile
不能按值传递数组,而你不能复制初始化数组。然而,你可以用元素初始化数组元素:':memberArray {{rhs [0] [0],...}}'或者使用'std :: array,2>'完成。 –
在类成员上使用'const'通常是一个糟糕的主意IMO –
@ M.M完全相反......如果除非初始化,否则不要修改它们,否则应始终使成员保持不变。 – Phil1970