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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: использование connect при наследовании классов  (Прочитано 9181 раз)
Vld2
Гость
« : Август 11, 2008, 23:23 »

Код:
Class AA 
{
 public:
  go();
  readMessage();
};

AA::go()
{
 connect(pushButton, ... , SLOT(readMessage));
}

class BB :public AA
{
 readMessage();
};

int main()
{
 BB obj;
 obj.go();
}
Если сработает сигнал, то функция readmessage какого класса сработает? По идеи AA, а как сделать так чтобы именно класса ВB?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Август 12, 2008, 00:25 »

Сделать слот readmessage виртуальным?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #2 : Август 12, 2008, 00:27 »

сделать АА::readMessage виртуальным?

зы. стиль написания охеренный...до этого на пых-пыхе писал? )
Записан
Mikhail
Программист
*****
Offline Offline

Сообщений: 587


Просмотр профиля
« Ответ #3 : Август 12, 2008, 09:20 »

сделать АА::readMessage виртуальным?

зы. стиль написания охеренный...до этого на пых-пыхе писал? )


Естественно, виртуальным.
Записан
Red Devil
Гость
« Ответ #4 : Август 12, 2008, 09:41 »

Только лучше сделать функцию readMessage, не виртуальной, которая будет вызывать виртуальную функцию.
В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.
Записан
ритт
Гость
« Ответ #5 : Август 12, 2008, 10:14 »

кстати, да...и тролли тоже всегда так делают

в данном случае самое очевидное не есть самое правильное Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Август 12, 2008, 12:24 »

В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.

А вы не помните в какой книге это писалось? (Интересно читануть что нить по этому поводу)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
uriel
Гость
« Ответ #7 : Август 12, 2008, 12:41 »

Если не изменяет память, то читал это у Шлее в книге по Qt4. Только там не так много нового по сравнению с тем же ассистентом, на самом деле. Подмигивающий
Записан
Alex03
Гость
« Ответ #8 : Август 12, 2008, 12:58 »

В какой-то книге писалось, что при использовании с сигналах и слотах виртуальной функции производительность на несколько порядков меньше.
А вы не помните в какой книге это писалось? (Интересно читануть что нить по этому поводу)
+1 Нельзя ли текст оттуда...
Если заглянуть в любой moc_srcname.cpp то там есть функция
Код:
int ClassName::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
В которой в switch-e прямо вызываются слоты, и виртуальные, и нет. Конечно вызов виртуальной функции накладывает необходимость обращения к таблице виртуальных функций из которой берётся адрес кода самой функции, но говорить о порядках потери производительности мягко говоря нельзя (скорее наоборот).
Записан
Alex03
Гость
« Ответ #9 : Август 12, 2008, 13:04 »

Как пример
Код:
        case 9: setVisible((*reinterpret_cast< bool(*)>(_a[1]))); break;
        case 10: setHidden((*reinterpret_cast< bool(*)>(_a[1]))); break;
из moc_qwidget.cpp.
setVisible - виртуальный метод, setHidden - нет.
Записан
ритт
Гость
« Ответ #10 : Август 12, 2008, 13:49 »

я не плюсовал за потерю производительности Улыбающийся
виртуальные слоты в кутэ используются наряду с обычными, хоть и в меньшей пропорции (чаще из соображений совместимости); просто на мой взгляд легче читать код, когда слоты невиртуальные - набрёл на коннект, нашёл код слота - и оп-па...а он виртуальнй и здесь не используется
Записан
Hort
Гость
« Ответ #11 : Август 27, 2008, 21:31 »

Цитировать
... Слоты могут быть и виртуальными.
Примечание
По данным фирмы Trolltech, соединение сигнала с виртуальным слотом
примерно в десять раз медленнее, чем с невиртуальным. Поэтому не стоит
делать слоты виртуальными, если нет особой необходимости.
это из книги Макса Шлее.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Август 27, 2008, 23:37 »

это из книги Макса Шлее.

http://doc.trolltech.com/4.4/signalsandslots.html

Цитировать
You can also define slots to be virtual, which we have found quite useful in practice.

Compared to callbacks, signals and slots are slightly slower because of the increased flexibility they provide, although the difference for real applications is insignificant. In general, emitting a signal that is connected to some slots, is approximately ten times slower than calling the receivers directly, with non-virtual function calls.

Где тут говориться про то что коннект к виртуальнм слотам медленее? Шлее жжот. Поправьте если я неправ
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #13 : Август 28, 2008, 00:49 »

либо переводчик отжёг, либо шлее Улыбающийся

падение производительности при коннекте обусловлено лишь тем, что требуется найти соединённый слот(слоты)...думаю, десятикратное падение сравнительно с прямым вызовом - пустяки
а удобство очевидно и оправдывает затраты - недаром существуют десятки проектов, повторяющих функционал сигналов/слотов в стиле кутэ или буст...
Записан
Vld2
Гость
« Ответ #14 : Сентябрь 02, 2008, 10:27 »

так на чем остановились? для больших программ слоты виртуальными не делать, а для малых можно
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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