Как улучшить классы?

Рейтинг: 1Ответов: 2Опубликовано: 29.01.2015

Как можно улучшить эти два класса? По заверению проверяющего тут что-то нехорошо, никак не возьму в толк, о чем он. До этого работал на C# и java...

Class T
{
    int _i;
    public:
    T(int i){_i=i};
    virtual void f();
    ~T();
}

Class T1: public T
{
    public:
    T1();
    virtual void f();
    ~T1();
}

Ответы

▲ 5Принят

На самом деле проблем у вас тут больше чем кода. Начнем с того, что код просто не компилируется - вместо class вы пишете Class, в конце каждого класса отсутствует точка с запятой, то же самое - в конструкторе после инструкции _i=i. Кроме того, не хватает определений для виртуальных функций (впрочем, можно предположить, что они просто вами не приведены)

Но это все мелочи. Самое главное, что скорее всего подразумевал ваш проверяющий - это тот замечательный факт, что в ваших классах есть виртуальные функции, но нет виртуальных деструкторов, что, кк известно, способно привести к утечке памяти. Проблема старая и давно известная, вот ее пример. Как можно видеть, в этом случае не вызывается деструктор класса *T1? что способно привести к утечке памяти. Как с этим бороться? Довольно просто - объявить виртуальные деструкторы. Пример/ Здесь, как можно видеть, деструкторы вызываются корректно.

Эта проблема возникает из-за того, что раз деструктор не является виртуальным, то его вызов осуществляется с помощью так называемого раннего связывания - исходя из указателя на базовый класс. Объявление деструктора (и функции вообще) виртуальным заставляет компилятор осуществлять так называемое позднее связывание и обращаться к деструктору фактического типа (не базового)

▲ 3

Называть переменную класса _i - как-то грубо. В целом, переменные i,j и k используются для переменных цикла, и читающий код это ожидает.

Переменная _i приватная (да, для классов по умолчанию переменные без явного указания доступа приватные, а для структур - публичные).

Дальше. У вас есть виртуальный метод и есть наследование. А это говорит о том, что нужно делать виртуальный деструктор. Думаю, что это один с основных моментов.

Используется явная инициализация в конструкторе. Хотя можно это сделать красивее. Я бы писал так:

T(int i): _i(i) {};

И под самый конец. Многие считают, что в начале должны идти публичное, а все приватное - в конец.