@vladislav9619996

Где в коде ошибка?

Выполняю практическое задание там нужно исправить код и объяснить почему будет работать именно так?
ошибку вроде нашел это
static B storrage;
и
delete a;
если статик убрать а перед delete поставить [] то все работает
но почему именно так не могу понять ПОЖАЙЛУСТА объясните, буду премного благодарен за ответ.
Код программы
#include <stdio.h> 
class B { public: 
int counter = 0; 
}; 
 
class A { public: 
    A() { storage.counter += 1; } 
    ~A() {}     int someValue; 
    static B storage; 
}; 
 
class AA : public A { public:     AA() {         someValue++; 
        data = new int[10]; 
    } 
    virtual ~AA() { delete data; } 
    int* data; 
}; 
 
void main(int argc, char** argv) {     auto a = new A;     delete a;     a = new AA; 
    printf("%d, %d", a->storage.counter, a->someValue);     delete a; 
}
  • Вопрос задан
  • 259 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
static убирать не следует, смысл этого B подсчитать , сколько экземпляров класса А создано(static значит, что из всех мест программы виден один и тот же объект в этой переменной).
С этой точки зрения доступ к статистической переменной через указатель на экземпляр класса это не совсем верно( a->storage.counter). Я бы ожидал видеть A::storage.counter.

delete [] в деструктор к АА, тут ты верно заметил. Нужно использовать именно эту форму delete, т.к. память выделена под массив (new int[10]). В остальных местах выделен 1 объект, поэтому надо delete без [].

Но, для того, чтобы деструктор АА вызывался при удалении указателя на А(auto a = new A; выведет тип A*), когда по этому указателю лежит объект класса АА, нужно объявить деструктор virtual ~А(а вовсе не virtual ~AA). При этом объявление виртуальным деструктоа АА само по себе ошибкой не будет.

someValue++ в конструкторе АА достаточно бессмысленно, т.к. это поле класса А, которое просто инициализированно нулём. В результате во всех экземплярах АА там будет 1. Непонятно, чего пытались добиться.

Вместо printf в С++ следует использовать operator<<, но не думаю, что придурок, составлявший такой тест, особо думал об этом.

Больше ничего не заметил.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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