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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как получить список интерфейсов, реализуемых классом?  (Прочитано 6439 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Февраль 01, 2011, 21:38 »

сабж

есть идея воспользоваться QMetaObject::d.stringdata
Записан
Akon
Гость
« Ответ #1 : Февраль 01, 2011, 22:40 »

А если не QObject тип?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Февраль 01, 2011, 23:30 »

А если не QObject тип?
Этот ответ мне известен - никак
Записан
Denjs
Гость
« Ответ #3 : Февраль 02, 2011, 00:05 »

 Смеющийся это сам спросил, сам ответил, и вообще)))) Смеющийся

мне вот тоже думается, что узнать список интерфейсов в чистом C++ - никак.


но, далее я начинаю плавать - поправьте меня - вероятно можно узнать реализует-ли класс заданный интерфейс через objectcast ссылки на объект к типу-прототипу ....
Интерфейсы же в С++ реализуются фактически через наследование? вот значит если удается привести ссулку на объект к заданному типу - то наверное он это реализует... не?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Февраль 02, 2011, 00:24 »

Делать 100 кастов на все интерфейсы? Нет, спасибо.
Для куобжектов - можно пробежаться по иерархии через QMetaObject::superClass() и сравнить указатели. Но это не сработает для Q_INTERFACES - у них нет метаобжекта. А мне надо для них.
Записан
Waryable
Гость
« Ответ #5 : Февраль 02, 2011, 06:50 »

Хм. Что значит список интерфейсов?
Записан
_govorilka
Гость
« Ответ #6 : Февраль 02, 2011, 07:00 »


Мос генерирует следующею функцию:

Код:
void *FwGraphicsView::qt_metacast(const char *_clname)
{
    if (!_clname) return 0;
    if (!strcmp(_clname, qt_meta_stringdata_FwGraphicsView))
        return static_cast<void*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "A"))
        return static_cast< A*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "B"))
        return static_cast< B*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "com.fireworks.fwgraphicsview.A/1.0"))
        return static_cast< A*>(const_cast< FwGraphicsView*>(this));
    if (!strcmp(_clname, "com.fireworks.fwgraphicsview.B/1.0"))
        return static_cast< B*>(const_cast< FwGraphicsView*>(this));
    return QObject::qt_metacast(_clname);
}


Эта функция вызывается, чтобы проверить можно привести объект QObject к интерфейсу с именем "B". По содержимому видно, что словаря внутри нет.

Можно поступить двумя способами:
1. Либо написать цикл который последовательно будет дергать qt_metacast и проверять вернулся 0 или нет.
2. Слегка модифицировать Moc, что вместо последовательности if(!strcmp(...)), он создавал словарь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Февраль 02, 2011, 10:43 »

Непонятно: это для "класса" (типа) или "указателя на объект" (экземпляра)? (разница есть).
Неоднократно замечал что походы в эту сторону (попытки создать такую общую конструкцию) кончаются плачевно - в лучшем случае массой потерянного времени.

Уместен банальный вопрос "а для чего это нужно?"
Записан
_govorilka
Гость
« Ответ #8 : Февраль 02, 2011, 12:52 »

Уместен банальный вопрос "а для чего это нужно?"

Думаю, Авварон собрался делать что-нибудь на подобие этого: http://ru.wikipedia.org/wiki/Remote_Procedure_Call
Записан
kirill
Гость
« Ответ #9 : Февраль 02, 2011, 19:02 »

Уместен банальный вопрос "а для чего это нужно?"

Думаю, Авварон собрался делать что-нибудь на подобие этого: http://ru.wikipedia.org/wiki/Remote_Procedure_Call

Забавно, на rsdn есть аналогичный вопрос от Анонима. Уж не одно ли это лицо?
http://кывт.рф/forum/cpp.qt/4139933.1.aspx
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Февраль 02, 2011, 19:09 »

нет, это не рпц и там спрашивал не я. Все гораздо проще - для типа Т сделать класс, к-ый будет "обрабатывать" экземпляры классов в том случае, если они реализуют интерфейс Т. Да, это делается через попытку каста, но сложность такого алгоритма - О(N), где Н - кол-во интерфейсов, в то же время в моем способе - О(почти 1) (на самом деле от m, где m - глубина иерархии, которая очень часто 1 - интерфейс/реализация)

Igors
Да, поправка - по указателю на объект.

_govorilka
Разве мок не прописывает имена интерфейсов в метаобжект наследника?
Записан
_govorilka
Гость
« Ответ #11 : Февраль 03, 2011, 07:49 »

_govorilka
Разве мок не прописывает имена интерфейсов в метаобжект наследника?

Исходник функции, это единственное упоминание об имени интерфейса в файле moc_*. Макросы Q_DECLARE_INTERFACE тоже вызывают её. Если бы все имена записывались в один массив (строку), то 5 if(...)..., там бы не было. Если ошибаюсь - поправте.

Посмотрите как реализован механизм Wraper'ов в QtScript. Возможно он подскажет правильное решение.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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