rusyska55011
@rusyska55011

Как обращаться к динамическому массиву, инициализированному в классе?

Мне нужно передать массив указателей на объекты в класс и скопировать их в переменную figure_collection, а переменная selected_figure должна выбирать рандомную из фигуру, обращаясь к figure_collection. На моменте выбора в конструкторе ошибок нет, но при обращении к функции select_new_figure() выдается ошибка чтения из памяти, обращаясь к figure_collection
Как реализовать динамический массив в классе?
class Mechanic {
public:

    Mechanic(Figure* figures[], unsigned collection_size) : collection_size(collection_size) {

        Figure** figure_colletion = new Figure * [this->collection_size];
        for (int i = 0; i < collection_size; i++) {
            this->figure_colletion[i] = figures[i];
        }

        this->selected_figure = figure_colletion[rand() % this->collection_size]; // Все работает нормально
    }

    ~Mechanic() {
        delete[](figure_colletion);
    }

    void select_new_figure() {
        this->selected_figure = this->figure_colletion[rand() % this->collection_size]; // Ошибка чтения 
    }

protected:

    Figure* selected_figure;
    Figure** figure_colletion;
    unsigned collection_size;

}

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

    Box box;
    Line line;
    AngleLine angleline;
    ZigZag zigzag;
    Triangle triangle;

    Figure* figure_collection[] = { &box, &line, &angleline, &zigzag, &triangle };

    Mechanic mechanic{ figure_collection, 5 };
    mechanic.select_new_figure();
}
  • Вопрос задан
  • 62 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Figure** figure_colletion = new Figure * [this->collection_size];


Вот тут в конструкторе вы заводите локальную переменную (с тем же именем, что и член класса) и что-то с ней делаете. Она "затенняет" член класса. А вот figure_colletion, к которому вы обрашаетесь в методе select_new_figure() - это уже член класса, который вы нигде не выделили и ничем не заполнили.

Поэтому любой уважающий себя стиль форматирования кода подразумевает, что члены класса должны быть приватными и как-то по особому именоваться (например, заканчиваться на "_", или начинаться с "p") тогда бы вы этой ошибки не совершили. Еще можно включить предупреждения при компиляции.

И еще, писать в методах this-> перед каждым обращением к члену класса не обязательно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы