Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальный и inline метод 
:(
    Опции темы
mes
Дата 28.7.2009, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  28.7.2009,  13:36 Найти цитируемый пост)
У Саттера вроде была фраза о том, чтобы делать виртуальными только прайват-методы.

Это несколько другая задача (можно сказать обратная нашей)- паттерн невиртуальный интерфейс. 
у нас "проблема" - лишние виртуальные вызовы. Данный паттерн ничем в данном вопросе помочь не может smile



--------------------
PM MAIL WWW   Вверх
Любитель
Дата 28.7.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Сорри, я невнимательно прочитал твой прошлый пост :(
Я думал речь о том, как обеспечить настраиваемость без дублирования кода, а не о минимизации виртуальных вызовов.
Тогда речь о другом - а стоит ли это делать вообще? Ведь parse (пусть и маленький) всё равно придётся писать везде в этом случае. Как я понимаю, речь о прикладном приложении, причём на Qt - там найдётся куча гораздо более узких мест..


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 28.7.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  28.7.2009,  14:16 Найти цитируемый пост)
Ведь parse (пусть и маленький) всё равно придётся писать везде в этом случае.

не обязательно.. вот пример, заодно и тс. будет легче 
Код

#include <iostream>

struct IParser { virtual void Parse () =0; };

template <class T, class Base>
class CParserOneTemplate : public Base
{
     public:
           void Parse ()  { crtBegin(); for (unsigned i=0; i<crtCount(); ++i) crtBody(i); crtEnd(); }

// вспомогательные функции статического виртуального вызова
    private:
           void crtBegin ()           { static_cast<T*>(this)->Begin();  }
           void crtBody  (unsigned i) { static_cast<T*>(this)->Body(i);  }
           void crtEnd   ()           { static_cast<T*>(this)->End();    }

           unsigned crtCount  ()      { static_cast<T*>(this)->Count();  }

// заготовки могут отсутствовать в шаблоне, но тогда обязательно должны быть реализованы
      public:
           void Begin ()           { std::cout << "[template-begin] "; }
           void Body  (unsigned i) { std::cout << "[template-body " << i << " ] ";  }
           void End  ()            { std::cout << "[template-end] ";   }

           unsigned Count  ()      { return 3; }
};

class CParserOneA : public CParserOneTemplate<CParserOneA, IParser>
{
    public:
       void Begin ()           { std::cout << "[A begin] "; }
       void Body  (unsigned i) { std::cout << "[A body " << i << " ] ";  }
       void End  ()            { std::cout << "[A end] ";   }

       unsigned Count  ()      { return 5; }
};

// если нам для каких то функций подходит базовая реализация, то нам ее реализовывать не надо 
class CParserOneB : public CParserOneTemplate<CParserOneB, IParser>  
{
    public:
       void Body  (unsigned i) { std::cout << "[B body " << i << " ] ";  }

       unsigned Count  ()      { return 2; }
};


int main(int argc, char* argv[])
{
  std::auto_ptr<IParser> p1 ( new CParserOneA() );
  std::auto_ptr<IParser> p2 ( new CParserOneB() );

  p1->Parse();
  std::cout << std::endl;

  p2->Parse();
  std::cout << std::endl;
 
  return 0;
}


как видите, никаких  лишних повторений исходного кода
smile



Это сообщение отредактировал(а) mes - 29.7.2009, 03:57


--------------------
PM MAIL WWW   Вверх
Любитель
Дата 28.7.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Да, красиво smile

Единственное - всё-таки увлекаться таким не стоит. Пусть код писать не будем, но для каждого цикла ведь весь цикл будет дублироваться (придесятке классов это несущественно, конечно).

Это сообщение отредактировал(а) Любитель - 28.7.2009, 17:06


--------------------
PM MAIL ICQ Skype   Вверх
mes
Дата 28.7.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Любитель @  28.7.2009,  15:59 Найти цитируемый пост)
Пусть код писать не будем, но для каждого цикла ведь весь цикл будет дублироваться (придесятке классов это несущественно, конечно).

ну это естественно, ради одного приходится жертвовать другим. Тут уж пусть тс. решает что ему важней: избежать лишних виртуальных вызовов или сэкономить на объеме машинного кода (излишки которого в общем случае для данной задачи минимальны)
smile


Это сообщение отредактировал(а) mes - 28.7.2009, 18:28


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.