Вопрос о бинарной совместимости |
Здравствуйте, гость ( Вход | Регистрация )
Вопрос о бинарной совместимости |
igor_bogomolov |
15.11.2010, 2:25
Сообщение
#1
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Если я существующий не виртуальный метод сделаю виртуальным, нарушит ли это обратную бинарную совместимость?
Конкретно интересует метод
Обратная бинарная совместимость предполагает, что программа собранная с текущей версией библиотеки будет работать с более новыми. QGridLayout абстрактный класс. Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить? Подскажите кто знает точно? |
|
|
Litkevich Yuriy |
15.11.2010, 3:26
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Алексей1153 |
15.11.2010, 7:46
Сообщение
#3
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
igor_bogomolov, можно же просто унаследовать и там уже завиртуалить. Пара строчек - и всё как нужно
|
|
|
igor_bogomolov |
15.11.2010, 8:48
Сообщение
#4
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Алексей1153, Мне нужно иметь возможность обратиться к собственной реализации getItemPosition через указатель на базовый класс, т.е. через указатель на QGridLayout.
да, поэтому тролей фик заставишь добавить новый метод. Они слоты в этом случае используют Блин. Вот это облом А можно чуть поподробнее почему так? Я не очень разбираюсь в вопросах бинарной совместимости. Я читал этот документ (BinaryCompatibilityWorkarounds), но как то он мне ясности не прибавил. тролей фик заставишь добавить новый метод. Я же не добавляю новый метод. Я всего лишь существующий хочу сделать виртуальным. Т.е. превратить в
----добавлено---- Почитал еще Policies/Binary Compatibility Issues With C++, тут тоже не нашел прямого запрета на мою модификацию |
|
|
Алексей1153 |
15.11.2010, 8:57
Сообщение
#5
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
не знаю, насколько это может помочь, но. В описании функции getItemPosition есть примечание
See also itemAtPosition() and itemAt(). где QLayoutItem * QGridLayout::itemAt ( int index ) const [virtual] |
|
|
igor_bogomolov |
15.11.2010, 9:30
Сообщение
#6
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Алексей1153, спасибо конечно за помощь. Но я все это конечно же видел и assistant сам читать умею. Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении.
Поясню тогда зачем это нужно. Qt Designer на данный момент не даёт возможности расширять его пользовательскими компоновщиками. И понятно почему. Расширить дизайнер можно только виджетами, а компоновщики ими не являются. После небольших модификаций Qt Designer (добавление нескольких проверок на ноль и удаление пару assert'ов) можно подсунуть ему виджет с встроенным в него компоновщикам (те компоновщики что находятся на панели виджетов на самом деле так и устроенны, но они жестко зашиты в коде). Но даже после всего этого гибкости не хватает, т.к. типы компоновщиков жестко вшиты в код qt designer'a и работает он только через интерфейсы существующих типов компоновщиков. А мне например нужно вставлять виджет в конкретную ячейку. Это позвалет сделать QGridLayout со своей функцией getItemPosition. И мне было бы достаточно сделать собственную реализацию грида и переопределить этот метод. Но он не виртуальный. Вот я теперь и не знаю что делать Здесь видео того, что получилось (тык) |
|
|
Алексей1153 |
15.11.2010, 9:50
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2939 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Меня интересует конкретный вопрос, который я сформулировал еще в первом сообщении я понимаю, конечно, что меня пытаются вежливо послать Но всё равно пусть QGridLayout* pL - указатель на объект потомок.
или я что-то опять недопонимаю ? Сообщение отредактировал Алексей1153 - 15.11.2010, 9:51 |
|
|
igor_bogomolov |
15.11.2010, 10:01
Сообщение
#8
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
Блин, Алексей, зафлудил тему. Читай первое сообщение темы - это то что я хочу выяснить. Юра ответ уже дал, я теперь хочу разобраться почему так.
Читай шестое сообщение темы, что бы понять что я делаю и зачем мне это нужно. Ты в очередной раз вообще не по теме пишешь |
|
|
kwisp |
15.11.2010, 11:45
Сообщение
#9
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Преобразование метода из не виртуального в виртуальный, вроде как, не должно ничего изменить? не знаю как бинарную совместимость, но логику работы определенных классов нарушить может. допустим в новой версии библиотеки в наследнике абстрактного класса добавляется, как и задумано разработчиками, невиртуальный одноименный метод, ты же в свою очередь сделав этот метод виртуальным не сможешь контролировать вызовы внутри библиотеки через указатель на абстрактный класс. т.е. разработчики библиотеки планировали что вызовется метод базового класса, а у тебя вызовется метод дочернего. по задаче можно предположить что getItemPosition вызывает какие-то виртуальный функции, и переопределив их можно добиться желаемого поведения. Примером этого служит паттерн невиртуального интерфейса. тролли его неособо жалуют конечно. К сожалению исходников qt нет под рукой. кинь сюда реализацию QGrifLayout и его предков - вместе покурим. П.С. если непонятно могу в коде показать. |
|
|
igor_bogomolov |
15.11.2010, 12:12
Сообщение
#10
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
К сожалению исходников qt нет под рукой Исходники всегда доступны http://qt.gitorious.org/qt/qt/blobs/4.7/sr...qgridlayout.cppНикаких виртуальных функций getItemPosition не вызывает. Просто эту функцию дёргает qt designer в момент генерации ui файла. Если точнее, сначала проверяется можно ли преобразовать компоновщик к QGridLayout. Если можно - преобразуется и запрашивается row, column, rowSpan, columnSpan функцией getItemPosition вот кусок кода дизайнера, где это происходит Раскрывающийся текст
Мне нужно, что бы вызвалась моя реализация getItemPosition. Это возможно если только она будет виртуальной. Теперь вопрос только в том, а можно ли её сделать виртуальной? Потому что если это нарушит бинарную совместимость, троли пошлют меня далеко. Если можно, а буду счастлив и дождусь следующего релиза Qt с данным изменением. Если нет, тупо форкаю дизайнер в своих целях и зашиваю в него свои компоновщики, т.к. нет ни какой возможности добавлять компоновщики через плагин |
|
|
Текстовая версия | Сейчас: 18.4.2024, 8:17 |