Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вызвать перегруженный оператор присваивания суперкласса. (http://forum.oszone.net/showthread.php?t=227364)

Smasher 08-02-2012 22:12 1854470

Вызвать перегруженный оператор присваивания суперкласса.
 
Есть вопрос касающийся кода, который (почти) целиком лежит там.
Как видно, существует класс Becher и подкласс BecherMitAufdruck. В суперклассе я создал перегруженный оператор присваивания.

Код:

Becher& Becher::operator=(const Becher &b)
{
        if (this != &b)
        {
                delete [] inhalt;
                inhalt = strdupnew(b.inhalt);
                fassungsvermoegen = b.fassungsvermoegen;
                fuellgrad = b.fuellgrad;
        }
        return *this;
}

В подклассе я тоже перегружаю этот оператор.

Код:

BecherMitAufdruck& BecherMitAufdruck::operator=(const BecherMitAufdruck &b)
{
        if (this != &b)
                {
                        delete [] inhalt;
                        delete [] aufdruck;
                        inhalt = strdupnew(b.inhalt);
                        aufdruck = strdupnew(b.aufdruck);
                        fassungsvermoegen = b.fassungsvermoegen;
                        fuellgrad = b.fuellgrad;
                }
        return *this;
}

Я хотел бы в подклассе выззвать перегруженный оператор суперкласса, а не писать для каждого параметра отдельное присваивание, т.к. за счёт этого частично теряется смысл наследования. Я пробовал

Код:

(Becher)(*this) = (Becher)b;
но это не работает. Понятно, что следует как-то определенить пространство имен, например

Код:

Becher::operator=(b)
но как это вызвать для объекта *this мне непонятно.

PhilB 10-02-2012 20:36 1855830

Думаю, нормальным решением будет следующее.
Поясню на примере класса Becher.
Создаются вспомогательные методы
Код:

void Becher::_copy(const Becher &b) {
        inhalt = strdupnew(b.inhalt);
        fassungsvermoegen = b.fassungsvermoegen;
        fuellgrad = b.fuellgrad;
}

void Becher::_destroy() {
        delete [] inhalt;
}

И основные методы будут вызывать их.
Код:

Becher& Becher::operator=(const Becher &b) {
    if (this != &b) {
                _destroy();
                _copy(b);
    }
    return *this;
}
Becher::~Becher() { _destroy(); }
Becher::Becher(const Becher &b) { _copy(b); }

Далее, в классе потомке, по аналогии создаются основные методы, вспомогательные же будут вызывать сначала впомогательные методы класса-родителя, а затем выполнять свою собственную работу.
Код:

void BecherMitAufdruck::_copy(const BecherMitAufdruck &b) {
        Becher::_copy(b);
        aufdruck = strdupnew(b.aufdruck);
}

BecherMitAufdruck& BecherMitAufdruck::operator=(const BecherMitAufdruck &b) {
        if (this != &b) {
                _destroy();
                _copy(b);
        }
        return *this;
}

Остальное по аналогии.

Надеюсь, мысль ясна.

El Scorpio 14-02-2012 04:01 1858219

Цитата:

Цитата Smasher
но как это вызвать для объекта *this мне непонятно. »

Элементарно, Ватсон. Пишешь
Код:

Becher::operator=(b);
И вызывается соответствующий метод соответствующего базового класса для объекта this
Также можно вызывать все остальные операторы базовых классов


Время: 03:26.

Время: 03:26.
© OSzone.net 2001-