2016-11-06 12 views
-1

Я новичок в кодировании на C++, и мы должны создать игру tictactoe для школы, и с этим у меня есть следующая проблема. У меня есть поле родительского класса (которое является игровым полем и состоит из массива данных 2d) и дочернего класса ConsoleField (который реализует метод печати для вывода на консоль). Мы делаем это, чтобы позже добавить еще один класс для GuiField и использовать ту же логику игры, но другой метод печати.C++ initialize 2d array в родительском классе приводит к плохому указателю в классе child

В любом случае, моя проблема заключается в том, что я хочу передать размер игрового поля из конструктора дочернего класса в конструктор родительского класса и инициализировать массив данных 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() {}; 

}; 

При отладке я считаю, что конструктор родительского класса делает все, что я хочу, чтобы это сделать, и устанавливает его член переменного размера = размер, который он получает из детского конструктора, а также создает указатель на массив данных 2D и инициализирует массив данных со всеми 0. Но при переходе к дочернему конструктору данные переменной-члена в дочернем классе не установлены, и его указатель возвращает 0000000.

Как использовать родительский конструктор для инициализации массива 2d для дочернего класса и получить действительный указатель на массив данных?

Спасибо за помощь.

ответ

2

удалить int** часть из int** data = new int*[size]; Вы не хотите, чтобы создать новую переменную на стеке, но установить класс memeber

+0

Ах, я понимаю. Спасибо! Я просмотрел код довольно-таки и не знаю, как это проскользнуло мимо меня. Я должен был это знать уже. Спасибо огромное! –

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

Это инициализирована локальная переменная data, а не переменный член.

Это должно быть просто:

data = new int*[size]; 
+0

Спасибо! Теперь я вижу свою ошибку. –