2011-07-11 48 views
5

我有一個基本的C++類.The頭看起來像這樣:Intitialzing在C數組++類和修改的左值問題

#pragma once 
class DataContainer 
{ 
public: 
    DataContainer(void); 
    ~DataContainer(void); 
    int* getAgeGroup(void); 
    int _ageGroupArray[5]; 
private: 

    int _ageIndex; 

}; 
我想並初始化所述_ageGroupArray [5類的cpp文件內

現在]用類構造器像這裏面的默認值:

#include "DataContainer.h" 


DataContainer::DataContainer(void) 
{ 

_ageGroupArray={20,32,56,43,72}; 

_ageIndex=10; 
} 

int* DataContainer::getAgeGroup(void){ 
return _ageGroupArray; 
} 
DataContainer::~DataContainer(void) 
{ 
} 

做這我得到「表達必須修改的左值」上_ageGroupArray line.So是完全不可能的初始化在構造函數中的數組對象?我發現的唯一解決方案是在範圍標識符外定義數組。有關這方面的任何澄清將不勝感激。

+0

爲什麼要定義一個空的析構函數?只是把它留下。 – fredoverflow

+0

男人,這只是爲了舉例:) –

回答

7

在目前的標準,因爲你已經注意到了,你不能在初始化列表語法構造函數初始化一個成員數組。有一些變通辦法,但他們都不是真的很漂亮:

// define as a (private) static const in the class 
const int DataContainer::_age_array_size = 5; 

DataContainer::DataContainer() : _ageIndex(10) { 
    int tmp[_age_array_size] = {20,32,56,43,72}; 
    std::copy(tmp, tmp+_age_array_size, _ageGroupArray); 
} 

如果數組中的值始終是相同的(在類的所有對象),那麼你可以創建一個單一的靜態副本:

class DataContainer { 
    static const int _ageGroupArraySize = 5; 
    static const int _ageGroupArray[ _ageGroupArraySize ]; 
// ... 
}; 
// Inside the cpp file: 
const int DataContainer::_ageGroupArray[_ageGroupArraySize] = {20,32,56,43,72}; 
5

你可以初始化數組當你創建/聲明它,而不是在那之後。

你可以做這樣的構造:

_ageGroupArray[0]=20; 
_ageGroupArray[1]=32; 
_ageGroupArray[2]=56; 
_ageGroupArray[3]=43; 
_ageGroupArray[4]=72; 

要知道,這是分配 &不初始化是很重要的。

1

試試這個:

int ageDefault[]={20,32,56,43,72}; 
memcpy(_ageGroupArray, ageDefault, sizeof(ageDefault)); 
+1

這是一種危險,因爲它只適用於POD類型,並且對所有其他類型默默地失敗(未定義的行爲)。 –

+1

@zabulus謝謝,這種方式它工作。但是你可以很快解釋像我這樣的noob爲什麼我不能在類實例化(我的意思是不使用memcpy)時直接初始化-ageGroupArray? –

+1

@Michael簡單的答案是:因爲沒有支持它的語法。 (我認爲這已經在C++ 11中修復了。)我認爲沒有語法的原因是C風格的數組在C++中被認爲是二等公民,如果使用'std :: vector',則可以使用兩個迭代器構造函數從靜態C樣式數組構造它。另外,就@David而言:他關於'memcpy'是正確的,但是有一個標準函數'std :: copy'可以使用。 –