rusyska55011
@rusyska55011

Как правильно передать двойной массив из класса наследника C++?

Как правильно инициализировать figure[4][4] через класса потомка Box? Если я создаю переменную типа Figure и передаю ей массив, все нормально выводится, объект класса заполняется. НО если я создаю переменную типа Box, которая уже вызывает конструктор Figure, выводится мусор.
Подскажите в чем ошибка?

#include <iostream>
#include <string>
#include <vector>

using namespace std;


class Figure {
	private:
		void fill_figure(bool new_figure[4][4]) {
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					this->figure[i][j] = new_figure[i][j];
				}
			}
		}

	protected:
		bool figure[4][4];
		string name;

	public:
		Figure(bool figure[4][4], string name) : name(name) {
			this->fill_figure(figure);
		};

		void show_figure() const {
			for (int i = 0; i < 4; i++) {
				for (int j = 0; j < 4; j++) {
					cout << this->figure[i][j] << " ";
				}
				cout << "\n";
			}
		}

};

class Box : public Figure {
	private:
		bool box[4][4] = {
			{0, 0, 0, 0},
			{0, 1, 1, 0},
			{0, 1, 1, 0},
			{0, 0, 0, 0},
		};

	public:

		Box() : Figure(this->box, "Box") {};

};



int main() {
	setlocale(LC_ALL, "ru");

	bool box[4][4] = {
			{0, 0, 0, 0},
			{0, 1, 1, 0},
			{0, 1, 1, 0},
			{0, 0, 0, 0},
	};
	
	Figure f{box, "Box"};
	f.show_figure();

	Box b;
	b.show_figure();
	

	return 0;

}
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Проблема в том, что Box::box - член класса и он инициализируется в конструкторе и в тот самый момент, где вы пытаетесь его использовать в конструкторе предка, оно оказывается еще не инициализировано.

Варианты решения:
- вынести эту костанту куда-то, например сделать ее глобальной.
- сделать Box::box static const (или constexpr - инче сами числа надо будет вынести вне объявления класса)
- использовать Box::box в теле конструктора. Но тогда надо сделать конструктор по умолчанию для Figure и вызывать fill_figure в конструкторе Box.
- создавать значение массива прямо в вызове конструктора Figure из Box:
Box() : Figure( (const bool[4][4]){
      {0, 0, 0, 0},
      {0, 1, 1, 0},
      {0, 1, 1, 0},
      {0, 0, 0, 0}
  }, "Box") {};


Лучше, конечно, завести static const.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы