0

我正在尝试将包含双精度数组的 double* 传递到我的类的构造函数中,并为元素分配值元素。

主要的:

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]在我的主函数中索引过去的数据。

我假设这不应该以这种方式完成,并且希望朝着正确的方向轻推。

4

5 回答 5

3

似乎您没有data在构造函数中分配内存。

Matrix::Matrix(int M, int N, double* input_data)
{
   data = new double[M*N];
   //....
}
于 2012-03-05T21:19:17.437 回答
1

我假设这是声明为data的类的成员。Matrixdouble*

您应该在构造函数中为此成员分配内存:

this->M = M;
this->N = N;
data = new double[M * N];
...

不要忘记调用delete[] data;析构函数。您还应该delete[] data;在 main 结束时调用。

于 2012-03-05T21:21:25.367 回答
0

您从未分配内存来存储数据。

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++ 中,为了允许这样的动态数组,您需要明确地说 data 是一个 size 的数组N * M。否则,您将分配到一个未定义的位置,该位置可以在任何地方。

于 2012-03-05T21:20:17.000 回答
0

您是否为数据分配了内存?在任何地方都看不到。但是,我什至不会为这样的构造函数而烦恼。只需将尺寸作为参数(或作为模板参数,但我猜这是另一回事)并使用 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;
于 2012-03-05T21:25:06.977 回答
0

正如每个人都指出的那样,您没有为data. 此外,您需要提供有用的析构函数、复制构造函数和赋值运算符。

如果您使用,所有这些 mishigas 都会消失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
}
于 2012-03-05T21:41:51.347 回答