2014-01-08 176 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