Russian Qt Forum
Май 25, 2024, 20:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Виртуальные функции  (Прочитано 8118 раз)
Nimbus
Гость
« Ответ #15 : Апрель 08, 2015, 17:10 »

А можно хотя бы чуточку поподробнее.
Если я правильно понял, у вас есть какое-то конечное множество базовых классов и чуть бОльшее множество дочерних классов.
И вам нужно в какой-то одной точке (скорее всего в generic'е) получать указатель на объект дочернего класса и вызывать виртуальный метод его родительского класса.

Так вот, самый танковый метод, сделать статический map (hash) из имён родительских классов и функторов, принимающих только this, вызывающих соответсвующий member function.
Т.е.

Код
C++ (Qt)
static QHash< QString, boost::function<void(QObject*)> > baseMethods;
if( baseMethods.isEmpty() )
{
   baseMethods[ "BaseClass1" ] = boost::bind( & BaseClass1::m, _1 );
   baseMethods[ "BaseClass2" ] = boost::bind( & BaseClass2::m, _1 );
   baseMethods[ "BaseClass3" ] = boost::bind( & BaseClass3::m, _1 );
   ...
   baseMethods[ "BaseClassN" ] = boost::bind( & BaseClassN::m, _1 );
}
 

Ну а затем в точке, где требуется вызывать метод, делаете
Код
C++ (Qt)
QString const baseClassName = obj->metaObject()->superClass().className();
baseMethods[ baseClassName ]( obj );
 

Это, конечно, изврат, но попробовать стоит. Правда, я не уверен, как там будут обстоять дела со множественным наследованием.
Ну либо, имена всех дочерних классов закинуть в map в качестве ключей, а значения продублировать для одинаковых базовых классов.

P.S. Если используете C++11/14 то можно вместо boost использовать std ;-)
« Последнее редактирование: Апрель 08, 2015, 17:37 от JC » Записан
Nimbus
Гость
« Ответ #16 : Апрель 08, 2015, 17:42 »

Хотя, насчёт boost::bind я не уверен, возвращаемый тип, скорее всего будет разным. Возможно потребуются дополнительные приседания с qobject_cast к нужным классам.
Записан
ksergey85
Гость
« Ответ #17 : Апрель 08, 2015, 18:05 »

Понял. Ну то есть ручками сохранять адреса методов всех базовых классов. Как один из вариантов обхода лобового решения (ну то есть поиска адреса метода конкретного класса ТОЛЬКО средствами языка или библиотеки Qt) конечно подойдет.
Есть еще вариант сделать этот метод (а в общем случае он конечно будет не один) слотом и вызывать через метаобъект суперкласса, но дело в том, что если это будет достаточно нагруженный работой метод, то я серьезно потеряю в производительности.
Записан
Nimbus
Гость
« Ответ #18 : Апрель 08, 2015, 18:15 »

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

Вот как начнёт проседать производительность, тогда и надо об этом задумываться  Подмигивающий А пока нужно сделать код как можно более универсальным, чтобы очень легко убрать ту дыру в производительности без особых изменений архитектуры.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 17.