我正试图将一个包含doubles数组的double*传递到我的类的构造函数中,并为元素分配value元素。
Main:
int main()
{
double* data = new double[4];
data[0] = 1.1; data[1] = 2.2; data[2] = 3.3; data[3] = 4.4;
Matrix a(2,2,data);
return 0;
}
这是我的构造函数:
Matrix::Matrix(int M, int N, double* input_data)
{
this->M = M;
this->N = N;
cout << "Matrix Constructor: M: " << M << "tN: " << N << endl;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i*N+j] = input_data[i*N+j]; //***This is the problem***
}
}
}
任何试图在构造函数中索引超过input_data[0]
的操作都会导致崩溃。data[]
可以很好地访问,并且我可以在我的主函数中索引数据的input_data[0]
。
我认为这不应该这样做,如果能朝着正确的方向推动,我将不胜感激。
您似乎没有在构造函数中为data
分配内存。
Matrix::Matrix(int M, int N, double* input_data)
{
data = new double[M*N];
//....
}
我假设data
是声明为double*
的Matrix
类的成员。
您应该在构造函数中为该成员分配内存:
this->M = M;
this->N = N;
data = new double[M * N];
...
不要忘记在析构函数中调用delete[] data;
。您还应该在main的末尾调用delete[] data;
。
您从未分配内存来存储数据。
Matrix::Matrix(int M, int N, double* input_data)
{
this->M = M;
this->N = N;
data = new double[N * M]; // Allocate space for N * M elements
cout << "Matrix Constructor: M: " << M << "tN: " << N << endl;
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
data[i*N+j] = input_data[i*N+j]; //***This is the problem***
}
}
}
在C++中,为了允许这样的动态数组,您需要明确表示数据是大小为N * M
的数组。否则,您将分配到一个未定义的位置,该位置可以是任何位置。
您为数据分配内存了吗?在任何地方都看不到。然而,我甚至不会为这样的构造函数而烦恼。只需将维度作为参数(或模板参数,但我想这是另一回事),并使用std::vector。用N*M个元素初始化矢量,并为元素访问重载运算符():
double& operator () (std::size_t i, std::size_t j);
const double& operator () (std::size_t i, std::size_t j) const;
data
分配空间。此外,您还需要提供一个有用的析构函数、复制构造函数和赋值运算符。
如果你使用std::vector
:,所有这些错误都会消失
std::vector<double> data;
Matrix::Matrix(int M, int N, double* input_data)
: M(M), N(N), data(input_data, input_data+M*N)
{
// No work required in here
}