Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 05.12.2008, 20:08   #1
Заблокирован
 Старший сержант
Аватар для shagart
 
shagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слухуshagart у всех на слуху
Регистрация: 16.07.2008
Сообщений: 209
Популярность: 1335
Сказал(а) спасибо: 231
Поблагодарили 236 раз(а) в 134 сообщениях
Отправить сообщение для shagart с помощью ICQ Отправить сообщение для shagart с помощью Telegram Отправить сообщение для shagart с помощью Yahoo Отправить сообщение для shagart с помощью Skype™
 
По умолчанию Как сделать виртуальной свободную функцию

Чаще всего этот прием я видел в отношении оператора operator<<. Точнее, не чаще, а всегда. На нем и разберем. Пусть у нас есть иерархия классов, и мы хотим определить диагностическую функцию Dump(). Она должна вываливать диагностику в заданное что-то (CDestination). У нас есть два варианта: или сделать функцию виртуальной в иерархии классов:
Код:
class CBase
{
	virtual void Dump( CDestination& ds ) = 0;
};
class CFirst : public CBase
{
	void Dump (CDestination& ds);
};
class CSecond : public CBase
{
	void Dump (CDestination& ds);
};

Или перегружать ее для каждого класса иерархии или в классе, или в свободной функции: 
CDestination
{
	void Dump ( CFirst& fs);
 	void Dump ( CSecond& sc);
};
void Dump (CDestination& ds, CThird& td); 
void Dump (CDestination& ds, CFourth& fr);
Ясно, первый вариант предпочтительнее. Во-первых, он обеспечивает полиморфное поведение. Во-вторых, своей диагностикой класс занимается сам, что тоже большой плюс. А второй способ почти невозможен: переписывать класс вывода каждый раз при появлении нового потомка в иерархии нереально (в двойной диспетчеризации дело другое, там просто нет иного выхода); в конце концов, он может быть в купленной библиотеке.

Но у второго варианта есть одно преимущество: функцию Dump() можно обозвать оператором operator<<, и это будет выглядеть весьма презентабельно:
Код:
// Это декларация
CDestination
{
	CDestination& operator<< ( CFirst& fs);
};
CDestination&  operator<< (CDestination& ds, CSecond& sc);

// А это применение
dStream << dObject;
Как сделать так, чтобы сохранить замечательное полиморфное поведение первого варианта, и применить эту радость идиота operator<< ? Легко: пусть operator<< вместо реальной работы просто вызывает виртуальную Dump(). Именно так сделано в MFC - объект afxDump вызывает виртуальную Dump() именно через operator<<. (Можно что угодно говорить про Microsoft, но факт есть факт - огромное число полезных и интересных приемов использовано в их продуктах и "... взять их у нее - наша задача!").
Код:
#include <iostream.h>
class CNoChange;
class CBase
{
public:
	virtual void passTo (CNoChange& _cb)
		{cout << "base passed" << endl; };
};
class CFirst: public CBase
{
public:
	void passTo (CNoChange& _cb)
		{ cout << "first passed" << endl; };
};
class CSecond: public CBase
{
public:
	void passTo (CNoChange& _cb)
		{ cout << "second passed" << endl; };
};
class CNoChange
{
public:
int a;
// Это вариант с оператором - членом класса.
	CNoChange& operator<< (CBase& _cb)
		{  _cb.passTo(*this); return *this;};
};
// а это - свободная функция.
//CNoChange& operator<< (CNoChange& _nc, CBase& _cb) 
//	{  _cb.passTo(_nc); return _nc;};
// проверить надо.
int main ()
{
	CNoChange nc;
	CFirst fs;
	CSecond sc;
	nc<<fs;
	nc<<sc;
	return 0;
}
  Ответить с цитированием
Пользователь сказал cпасибо:
Ivan_32 (05.12.2008)
Ответ

Метки
виртуальной, свободную, сделать, функцию


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Help] Как серву откат сделать? semen007 Треп 19 17.06.2009 07:10
как сделать ник такой? (см. внутри) Zaco Rising Force Online 12 28.10.2008 12:28
как сделать скорость атаки спадона через итем Romaxa Rising Force Online 12 06.09.2008 11:51

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 04:29.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net