Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> dynamic_cast между dll-ками 
:(
    Опции темы
borisbn
Дата 1.2.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Добрый день всем.
Читая документацию по Qt набрёл на такую фразу в описании ф-ции qobject_cast
Цитата

The qobject_cast() function behaves similarly to the standard C++ dynamic_cast(), with the advantages that it doesn't require RTTI support and it works across dynamic library boundaries.

из чего я делаю вывод, что dynamic_cast может не работать across dynamic library boundaries.
Погуглив на тему rtti, dynamic_cast, shared libraries и т.п., нашёл несколько обсуждений на эту тему, но
1) все они касались передачи между библиотеками указателей на шаблонные классы
2) везде присутствовало упоминание о gcc

Провёл такой эксперимент на MSVC 2008
сделал два проекта DLL и консольный.
код DLL-ки

i_face.h
Код

#if defined( RTTI_TEST_EXPORTS )
    #define FUNCTION_DECLSPEC dllexport
#else
    #define FUNCTION_DECLSPEC dllimport
#endif

template< typename T >
class IFace {
public:
    virtual ~IFace(){}
    virtual void foo() = 0;
};

typedef IFace< int > IFaceInt;

//---------------
#include <stdio.h>

template< typename T >
class FaceImpl : public IFace< T > {
public:
    ~FaceImpl(){}
    virtual void foo() {
        T x = 0;
        printf( "FaceImpl::foo %d\n", x );
    }
    void fooImpl() {
        T x = 3;
        printf( "FaceImpl::fooImpl %d\n", x );
    }
};

__declspec( FUNCTION_DECLSPEC ) IFaceInt * creafeFace();


i_face.cpp
Код

#include "i_face.h"

IFaceInt * creafeFace() {
    return new FaceImpl< int >();
}


и код консольной программы
Код

#include "../rtti_test/i_face.h"
#pragma comment( lib, "../Debug/rtti_test.lib" )

int main() {
    IFace< int > * face = creafeFace();
    face->foo();
    FaceImpl< int > * faceImpl = dynamic_cast< FaceImpl< int > * >( face );
    faceImpl->fooImpl();
    FaceImpl< float > * faceImpl_f = dynamic_cast< FaceImpl< float > * >( face );
    printf( "%p\n", faceImpl_f );
    delete face;
    return 0;
}


выводит, как и ожидалось, так
Цитата

FaceImpl::foo 0
FaceImpl::fooImpl 3
00000000

т.е. всё в порядке.

теперь собственно
вопрос:
1) Что это за проблема "RTTI across dynamic library boundaries" ?
2) Кто-нибудь сталкивался с проблемой передачи указателя на базовый класс между библиотеками с последующим dynamic_cast'ом его ?
3) Просьба проверить это на gcc, т.к. на liveworkspace или на codepad создать и загрузить потом *.so нельзя.

Спасибо


P.S. То, что dynamic_cast "вырастает" из-за плохого проектирования - знаю и стараюсь никогда не использовать. Так что вопрос скорее из теоретической области, нежели из практической

Это сообщение отредактировал(а) borisbn - 1.2.2011, 17:24


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 1.2.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



3.gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5):
Цитата
FaceImpl::foo 0
FaceImpl::fooImpl 3
(nil)


Может проблема имеется только в случае плагинов (загрузки библиотек в рантайме) или при использовании dynamic_cast в библиотеке?..
PM   Вверх
borisbn
Дата 1.2.2011, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



bsa, спасибо. А ты также делал *.so + *.executable ?
Завтра попробую загружать через QLibrary::resolve и вариант с cast'ом в dll-ке.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 1.2.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(borisbn @  1.2.2011,  20:53 Найти цитируемый пост)
А ты также делал *.so + *.executable ?

да.

Мне вообще не понятно, какая может быть проблема. Ведь информация о типе хранится в vtable.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.