@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<<, но не думаю, что придурок, составлявший такой тест, особо думал об этом.

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

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

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