2011-09-05 132 views
0

有一種方法來初始化一個數組,像這樣:初始化類對象陣列

static const vec3d<long> XI[Q] = { 
    vec3d<long>(0, 0, 0), 

vec3d<long>(-1, 0, 0), vec3d<long>(0,-1, 0), vec3d<long>(0, 0,-1), 
vec3d<long>(-1,-1, 0), vec3d<long>(-1, 1, 0), vec3d<long>(-1, 0,-1), [etc] 
}; 

其中

00039 template<typename TYPE> 
00040 class vec3d : public vec<TYPE>{ 
00041 public: 
00042 
00049   vec3d() : vec<TYPE>(0, 3){}; 
00057   vec3d(TYPE right) : vec<TYPE>(right, 3){}; 
00065   vec3d(TYPE X_val, TYPE Y_val, TYPE Z_val) : vec<TYPE>(0, 3){ 
00066     this->val[0] = X_val; 
00067     this->val[1] = Y_val; 
00068     this->val[2] = Z_val; 
00069   }; 
00077   vec3d(vec3d<TYPE>& right) : vec<TYPE>(0, 3){ 
00078     this->val[0] = right[0]; 
00079     this->val[1] = right[1]; 
00080     this->val[2] = right[2]; 
00081   }; [etc] }; 

00040 template<typename TYPE> 
    00041 class vec{ 
    00042 public: 
    00047   TYPE *val; 
    00052   int dimension; 
    00053 public: 
    00060   vec(); 
    00066   vec(TYPE right); 
    00073   vec(TYPE right, int _dimension); 
    00081   vec(vec<TYPE> &right); 
    00082 
    00087   ~vec(); 
    00088 
    00089 
    00090   TYPE& operator[](int right); 
    00091   vec<TYPE>& operator=(TYPE right); 
    00092   vec<TYPE>& operator=(vec<TYPE> &right); 
[etc] }; 

來源是:

00049 template<typename TYPE> 
00050 vec<TYPE>::vec(TYPE right, int _dimension){ 
00051   dimension = _dimension; 
00052   val = new TYPE[_dimension]; 
00053   assert(val); 
00054   for(int i = 0; i < dimension; i++) val[i] = right; 
00055 
00056 }; 

00075 template<typename TYPE> 
00076 TYPE& vec<TYPE>::operator[](int right){ 
00077   assert((right < dimension)); 
00078   assert(right >= 0); 
00079   assert(val); 
00080   return val[right]; 
00081 }; 

是構造函數。 Q被聲明爲「static const int」,所以它應該滿足C++標準是非變量的,對嗎?

編譯器說: 錯誤:呼叫沒有匹配功能 'ALBM :: vec3d :: vec3d(ALBM :: vec3d)' vec3d.h:77:2:注意:考生:ALBM :: vec3d: :vec3d(albm :: vec3d &)[with TYPE = long int]

顯然有問題,我不能在這裏通過vec3d &。有一些解決方法嗎?首先定義每個單獨的載體似乎是一個解決方案。雖然是一個謎題...

對不起,我的愚蠢問題......也許這個線程存在某處,但我沒有找到它。可能這個問題有一些我不知道的特殊名字 - 因此我不能谷歌它! 「擴展初始化列表」,「一流的數組初始化」和這樣的沒有做的伎倆......

SOLUTION:一些後處理在這裏...也許如此。其他遭遇相同的概率: 拷貝構造函數缺乏一個「常量」:

00077   vec3d(const vec3d<TYPE>& right) : vec<TYPE>(0, 3){ 
00078     this->val[0] = right.val[0]; 
00079     this->val[1] = right.val[1]; 
00080     this->val[2] = right.val[2]; 

而且我不能訪問權[直接] - 我的猜測是有原因的將是模板式的 - 但right.val []是訣竅!

+0

發佈*最小*和*完整*代碼示例。 –

+0

編輯:希望這有助於? – 0815ZED

回答

0

你的拷貝構造函數沒有正確地宣佈 - 的toCopyFrom參數需要常量

vec3d<TYPE>(const vec3d<TYPE>& toCopyFrom) 

編輯:現在

,在您對下標操作符第二個問題:

基類中的下標運算符operator[]()沒有const(即只讀)語義。在您的拷貝構造函數中,您試圖通過該下標運算符訪問right中的值。現在,right參數被聲明爲const,這基本上意味着您不允許更改right的內部狀態。由於您的operator[]()函數不是常量,因此該語言的假設是函數可以改變/更改right的狀態 - 這與right的常量衝突。事實上,該函數實際上會返回對類的內部成員變量的引用,這將允許該代碼的客戶端更改right的內部狀態!

的解決方案是在基類中提供額外的,常量,下標操作:

const TYPE& operator[](int right) const 

注 - 就個人而言,我會重新命名rightindex - 爲清楚起見。

的上述函數簽名後const爲它提供常量訪問語義,它可調用 - 例如 - X = right[n]rightconst。返回類型的前導const僅僅意味着返回的TYPE引用將是const,這會阻止您在right爲常量時執行right[n] = x。注意 - 添加函數時,函數的實現(主體)應該看起來與現有的下標運算符相同。你沒有提供,所以我不能寫。

總之,我建議你閱讀const和'const-correctness'主題。

+0

好的,謝謝。但現在我得到了 – 0815ZED

+0

vec3d.h:78:3:錯誤:將'const albm :: vec3d '作爲'TYPE'和albm :: vec :: operator [](int) = long int]'丟棄限定符 – 0815ZED

+0

我想你可能需要發佈更多的代碼,特別是包含operator []()成員函數。 –

1

鑑於

00039 template<typename TYPE> 
00040 class vec3d : public vec<TYPE>{ 
00041 public: 
00042 
00049   vec3d() : vec<TYPE>(0, 3){}; 
00057   vec3d(TYPE right) : vec<TYPE>(right, 3){}; 
00065   vec3d(TYPE X_val, TYPE Y_val, TYPE Z_val) : vec<TYPE>(0, 3){ 
00066     this->val[0] = X_val; 
00067     this->val[1] = Y_val; 
00068     this->val[2] = Z_val; 
00069   }; 
00077   vec3d(vec3d<TYPE>& right) : vec<TYPE>(0, 3){ 
00078     this->val[0] = right[0]; 
00079     this->val[1] = right[1]; 
00080     this->val[2] = right[2]; 
00081   }; [etc] }; 

在管線77中定義的複製構造具有非const參數,它不能被綁定到一個rvalue參數。

只是刪除線77至81

編譯器會爲你生成一個不錯的拷貝構造函數。

Cheers & hth。,

+0

現在它抱怨:沒有匹配函數調用'albm :: vec3d :: vec3d(albm :: vec3d )' – 0815ZED