在类中使用 2D 数组

Using 2d array in a class

本文关键字:2D 数组      更新时间:2023-10-16

我遇到了一些问题。

1)它说将"矩阵"声明为2d数组必须有边界(头文件中的mPoint)。 为什么?我希望它是动态的,我该如何解决它?

2)另一个问题是"mPoint"没有在这个范围内声明,在.cpp文件中的(Square_Matrix::Set_Size)。

3)最后,它说析构函数(Square_Matrix::~Square_Matrix)中的定义是隐式声明的。

我的 c++ 书中似乎没有任何东西可以回答我的问题。

//header file
#include <iostream>
using namespace std;
class Square_Matrix
{
public:
   int **mPoint;
   int N;
   Square_Matrix();
   ~Square_Matrix();
   void Set_Size (int new_size);
};

//.cpp file
#include <iostream>
using namespace std;
#include "Square_Matrix.h"

Square_Matrix::Square_Matrix()
{
    mPoint = new int*[0];
    mPoint[0] = new int[0];
    N = 0;
}
Square_Matrix::~Square_Matrix()   //destructor
{
    for (int i = 0; i < N; i++){
        delete [] mPoint[i];
    }
    delete [] mPoint;
}
void Square_Matrix::Set_Size (int new_size)
{
    for (int i = 0; i < N; i++){ //deallocates memory if there's already a matrix
        delete [] mPoint[i];
    }
    delete [] mPoint;
    N = new_size;
    mPoint = new int*[new_size];    //create dynamic 2d array of size new_size
    for (int i = 0; i < new_size; i++){
        mPoint[i] = new int[new_size];
    }
}

您没有在类定义中声明析构函数。因此,编译器隐式声明了它。但是,您可以自己显式定义析构函数。你可能不会那样做。

在构造函数中,您没有初始化 mPoint。因此,例如函数Set_Size中的代码具有未定义的行为。

Square_Matrix::Square_Matrix()
{
    mPoint = new int*[0];
    mPoint[0] = new int[0];
    N = 0;
}

你不想这样做,它是无效的。 只需将 mPoint 的值设置为 nullptr 即可。 不能分配大小为 0 的数组。

Square_Matrix::Square_Matrix() : mPoint(nullptr), N(0)
{
}