Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Вызвать перегруженный оператор присваивания суперкласса.

Ответить
Настройки темы
C/C++ - Вызвать перегруженный оператор присваивания суперкласса.

Старожил


Сообщения: 192
Благодарности: 6


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: Smasher
Дата: 09-02-2012
Есть вопрос касающийся кода, который (почти) целиком лежит там.
Как видно, существует класс 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 мне непонятно.

Отправлено: 22:12, 08-02-2012

 

Старожил


Сообщения: 198
Благодарности: 51

Профиль | Отправить PM | Цитировать


Думаю, нормальным решением будет следующее.
Поясню на примере класса 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;
}
Остальное по аналогии.

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

Последний раз редактировалось PhilB, 10-02-2012 в 23:41.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:36, 10-02-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


Цитата Smasher:
но как это вызвать для объекта *this мне непонятно. »
Элементарно, Ватсон. Пишешь
Код: Выделить весь код
Becher::operator=(b);
И вызывается соответствующий метод соответствующего базового класса для объекта this
Также можно вызывать все остальные операторы базовых классов

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.


Отправлено: 04:01, 14-02-2012 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Вызвать перегруженный оператор присваивания суперкласса.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как оператор округляет проценты united Мобильные ОС, смартфоны и планшеты 11 18-02-2008 13:19
[решено] Javascript - Оператор === hasherfrog Вебмастеру 5 25-07-2007 14:05
оператор If... Else Pandora Вебмастеру 9 29-07-2005 08:43
GPRS + Оператор kiro Мобильные ОС, смартфоны и планшеты 3 21-03-2004 21:19
Delphi - Оператор доступа в Delphi LedWorm Программирование и базы данных 6 29-02-2004 20:46




 
Переход