初始化内部分配的矩阵

时间:2014-01-08 08:45:30

标签: c++ arrays dynamic

我必须编写一个构造函数来实现初始化内部分配矩阵的函数。给定的代码看起来像(只有构造函数):

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

所以,我的第一个问题是:':'背后的部分是什么意思(_n(n), _m(0lu))? 此外,据我所知,我需要一个指向我分配的内存的返回指针。它是否正确?我的第一个想法是使用posix_memalign(...)。这是否正确?
非常感谢你!

2 个答案:

答案 0 :(得分:2)

:_n(n), _m(0lu) 

是会员内部化列表。方法_n(似乎是成员变量)正在向n提供_m并为{{1}}

提供同步

更多详情here

答案 1 :(得分: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"?

但这并不能解决您的初始问题:“初始化内部分配矩阵的功能”

构造函数的作用是复制size(n)并将指针初始化为NULL。 (NULL与0 [1]同义)所以你需要一些方法来内部分配并初始化。

我对Matrix类有一个问题。通常矩阵有2维,所以它是NxN矩阵或n是元素数,我们不知道矩阵是什么尺寸。我将假设它是NxN矩阵,因为它经常用于计算机图形学。

第1步:内部分配

所以,分配一些内存:

_m = new float[n*n];

这可以将赋值替换为NULL,因为为什么首先要将它设置为NULL然后立即更改。

第2步:初始化

假设调用代码将足够的数据放入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中,在某些情况下这并不完全正确,但这些都是细节而且无关紧要。