2014-01-08 366 views
0

我必須編寫一個構造函數來實現初始化內部分配矩陣的函數。給定的代碼如下所示(僅構造函數):初始化內部分配的矩陣

Matrix(const float* m, size_t n) : _n(n), _m(0lu) 
    { 
     //Missing 
    } 

所以,我的第一個問題是:什麼是背後的一部分「:」平均(_n(n), _m(0lu))?
此外,據我所知,我需要一個指向我分配的內存的返回指針。它是否正確?我的第一個想法是使用posix_memalign(...)。這是正確的嗎?
非常感謝!

回答

2

我假定這基本對象:

class Matrix 
{ 
    // stuff 
private: 
    size_t _n; 
    float* _m; 
} 

構造的部分是一個初始化列表。這是同義的接線:

Matrix(const float* m, size_t n) 
{ 
    _n = n; 
    _m = 0lu; 
} 

這裏是一個很好能解密,你爲什麼要使用它們:[10.6] Should my constructors use "initialization lists" or "assignment"?

但是,這並不解決您最初的問題:「功能用於初始化內部分配矩陣」

構造函數的作用是複製大小(n)並將指針初始化爲NULL。 (NULL與0 [1]同義)所以你需要一些方法來在內部分配並進行初始化。

我有一個Matrix類的問題。通常情況下,矩陣有2維,所以無論是N×N矩陣還是n是元素數,我們都不知道矩陣的維數。我會假設它是N×N矩陣,因爲這在計算機圖形學中經常使用。

第1步:內部分配

所以,分配一些內存:

_m = new float[n*n]; 

這可以代替分配爲NULL,因爲它爲什麼應該是先設置爲NULL,然後更改後的權利。

第二步:初始化

假設調用代碼把足夠的數據爲m,只需使用memcpy

std::memcpy(_m, m, n*n*sizeof(float)); 

如果你覺得自虐,你也可以複製每一個元素:

for (unsigned int i = 0; i < n*n; i++) 
{ 
    _m[i] = m[i]; 
} 

所以你的最終構造函數看起來像這樣:

#include <cstring> 

Matrix(const float* m, size_t n) 
: _n(n), _m(new float[n*n]) 
{ 
    std::memcpy(_m, m, n*n*sizeof(float)); 
} 

最後,因爲你分配的內存,你不應該忘記刪除它在析構函數:

Matrix::~Matrix() 
{ 
    delete [] _m; 
} 

注數組刪除操作。

[1]在C++ 11和C99這不是在某些情況下完全真實的,但這些都是細節和不相關的。

+0

謝謝,我對「分配」(我想過「對齊」和類似的東西)有點困惑...... –

2
:_n(n), _m(0lu) 

是成員內部函數列表。裝置_n(這似乎是構件變量)被assing n到它和simialr爲_m

更多細節here