我必须编写一个构造函数来实现初始化内部分配矩阵的函数。给定的代码看起来像(只有构造函数):
Matrix(const float* m, size_t n) : _n(n), _m(0lu)
{
//Missing
}
所以,我的第一个问题是:':'背后的部分是什么意思(_n(n), _m(0lu)
)?
此外,据我所知,我需要一个指向我分配的内存的返回指针。它是否正确?我的第一个想法是使用posix_memalign(...)
。这是否正确?
非常感谢你!
答案 0 :(得分:2)
答案 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中,在某些情况下这并不完全正确,但这些都是细节而且无关紧要。