2017-04-20 54 views
0

我有一个包含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中完全可能吗?

+3

不能按值传递数组,而你不能复制初始化数组。然而,你可以用元素初始化数组元素:':memberArray {{rhs [0] [0],...}}'或者使用'std :: array ,2>'完成。 –

+1

在类成员上使用'const'通常是一个糟糕的主意IMO –

+1

@ M.M完全相反......如果除非初始化,否则不要修改它们,否则应始终使成员保持不变。 – Phil1970

回答

0

对您的问题的评论有一些很好的信息。

这里之后是工作代码:

//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

相关问题