2017-04-20 57 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

相關問題