如何将"double*"传递给类函数,并将该值应用于该类中的另一个"double*"



我正试图将一个包含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
}

最新更新