dynamic_cast возвращает ПУСТОЙ УКАЗАТЕЛЬ, но он не был должен

У меня есть следующая иерархия классов:

class IStorage {
    [...]
}
Q_DECLARE_INTERFACE(IStorage, "ch.gorrion.smssender.IStorage/1.0")


class ISQLiteStorage: public IStorage { 
    Q_INTERFACES(IStorage)

    [...] 
}
Q_DECLARE_INTERFACE(ISQLiteStorage, "ch.gorrion.smssender.ISQLiteStorage/1.0")


class DASQLiteStorage: public QObject, public ISQLiteStorage {
    Q_OBJECT
    Q_INTERFACES(ISQLiteStorage)

    [...]
}

Я использую QT и пытаюсь создать плагин (для моего приложения) с QtPlugin. Я создаю экземпляр DASQLiteStorage, и я привожу этот пример к объекту ИЗ плагина:

// the next line is within my main app.
// storage is the DASQLiteStorage instance.
// gateway is an object from within the plugin.
gateway->setDefaultStorage(storage);

// this method lies within the plugin
void AbstractGateway::setDefaultStorage(IStorage* storage) {
    defaultStorage_ = dynamic_cast<ISQLiteStorage*>(storage);
}

Проблема, что dynamic_cast возвращает меня нулевой указатель (не ожидаемый) при выполнении dynamic_cast в рамках моего главного приложения (т.е. перед "шлюз-> setDefaultStorage (устройство хранения данных)";) дает мне допустимую (ожидаемую) подсказку.

Кто-либо знает, почему это могло произойти? Программа действует в другом диапазоне памяти в качестве плагина? Это могло привести к таким проблемам? Какие-либо идеи, как зафиксировать это?

Большое спасибо!


Править: Я испытал некоторые предложения:

// this method lies within the plugin
void AbstractGateway::setDefaultStorage(IStorage* storage) {
    ISQLiteStorage* s = dynamic_cast<ISQLiteStorage*>(storage);
    s = static_cast<ISQLiteStorage*>(storage);
    s = qobject_cast<ISQLiteStorage*>((QObject*)storage);

    defaultStorage_ = s;
}

В первой строке метода s равняется ПУСТОМУ УКАЗАТЕЛЮ, во втором s содержит корректный указатель и в третьем другой указатель. Почему эти указатели не равны?
И почему мог dynamic_cast все еще не работать, хотя я использую теперь:

pluginLoader()->setLoadHints(QLibrary::ResolveAllSymbolsHint | QLibrary::ExportExternalSymbolsHint);




EDIT2: Я заметил, что отказ сегментации, который я получаю немного далее в коде, также связан с этим. У меня есть следующая конструкция:

// The following classes are defined within the main app.
class ILoginAccount: public IAccount [...]

class AbstractAccountStroageOfficer {
public:
    AbstractAccountStroageOfficer(IAccount* account)[...]
}


// These classes are defined within my plugin and are created from within the plugin.
class BCAccount: public ILoginAccount {
public:
    BCAccount()
      : ILoginAccount(new DAAccountStorageOfficer(this))
    {};
}

class DAAccountStorageOfficer: public AbstractAccountStorageOfficer {
public:
    DAAccountStorageOfficer(ILoginAccount* account)
      : AbstractAccountStorageOfficer(account) // This line raises a segfault.
    {
        IAccount* a = account; // This line raises a segfault as well.
        a = dynamic_cast<IAccount*>(account); // This as well.
        a = static_cast<IAccount*>(account); // This as well.
    }
}

Эти отказы сегментации не должны происходить, не так ли? Но почему делают их?

5
задан Sämy 4 January 2010 в 16:28
поделиться

1 ответ

В основном, RTTI ненадежен в пределах модулей. Различные компиляторы ведут себя по-разному; в этом случае вам придется исследовать, как работает ваш компилятор/версия. Конечно, если у вас другой компилятор/версия для основного приложения и плагина, то у него явно нет шансов на работу.

Используйте static_cast для работы.

.
4
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: