在类中使用2d数组

时间:2014-02-18 02:14:46

标签: c++ object pointers multidimensional-array

我遇到了一些问题。

1)它表示'matrix'作为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];
    }
}

2 个答案:

答案 0 :(得分:0)

您没有在类定义中声明析构函数。所以编译器隐式声明了它。然而,您自己定义析构函数。你可能不这样做。

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

答案 1 :(得分:0)

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)
{
}