C ++在父类中初始化2d数组导致子类中的错误指针

时间:2016-11-06 16:00:23

标签: c++ constructor initialization parent

我是c ++编码的新手,我们必须为学校创建一个tictactoe游戏,我有以下问题。我有一个父类Field(它是一个游戏区域,由一个2d数据数组组成)和一个子类ConsoleField(它实现了一个在控制台上输出的print方法)。我们这样做是为了以后我们可以为GuiField添加另一个类并使用相同的游戏逻辑但是使用不同的打印方法。

无论如何,我的问题是我想将子字段构造函数中的游戏字段大小传递给父类构造函数并初始化2d数据数组。我尝试使用构造函数初始化列表以下面的方式执行此操作。

class ConsoleField : public Field {

public:
    ConsoleField(int size) : Field(size)
    {
    }

    void print() = 0;

};

class Field {

protected:
    int size;
    int** data;

public:
    Field(int size):size(size)
    {
        int** data = new int*[size];
        for (int i = 0; i < size; i++)
        {
            data[i] = new int[size];
        }

        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                data[i][j] = 0;
            }
        }
    }

    void print () {};

};

调试时,我发现父类构造函数执行了我想要它做的所有事情,并设置了它从子构造函数获取的成员变量size = size,并创建了一个指向数据2d数组的指针,并使用它初始化数据数组。但是当跳回到子构造函数时,未设置子类中的成员变量数据,并且其指针返回0000000.

如何使用父构造函数初始化子类的2d数组并获取指向数据数组的有效指针?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

int**移除int** data = new int*[size];部分 您不希望在堆栈上创建新变量,但设置类memeber

答案 1 :(得分:1)

int** data = new int*[size];

这初始化了一个局部变量data,而不是成员变量。

应该只是:

data = new int*[size];