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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: использование connect при наследовании классов  (Прочитано 9455 раз)
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.024 секунд. Запросов: 20.