C ++ Определить тип void * из двух классов - PullRequest
0 голосов
/ 21 мая 2018

Я использую wxWidgets и у меня есть функция поиска в редакторе карт для моей онлайн-игры.

Я ищу объекты по различным критериям и помещаю эти объекты в список ComboBox по их имени, а такжедобавить объект в качестве справочных данных (void*),

У меня есть событие onClickResult Я хочу отметить и перейти к объекту, который работает, но он вызывает сбой моего приложения при переключении между типами объектов, как кажется, яне может "reinterpret_cast" определить объекты класса, которые не имеют никакого отношения (без подклассов, два независимых класса без какого-либо отношения).

Вопрос: есть ли способ определить, какой тип данных находится в void* (event.GetClientData() возвращает void*) и правильно разыграть его?

void SearchResultWindow::OnClickResult(wxCommandEvent& event) {
    Item* item = reinterpret_cast<Item*>(event.GetClientData());
    if (item) {
        this->selectRelatedMapItem(item);
    } else {
        Creature* creature = reinterpret_cast<Creature*>(event.GetClientData());
        if (creature) {
            this->selectRelatedMapCreature(creature);
        }
    }
}

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Не добавляйте сам объект как данные клиента void*, а скорее указатель на структуру, имеющую достаточное количество членов для поиска объекта.Например, некоторый идентификатор для контейнера, содержащего объект, и индекс в контейнере.

0 голосов
/ 21 мая 2018

Нет, в C ++ нет переносимого способа сделать это.

Как только вы приведете к void* или const void*, вы сообщаете компилятору, что собираетесь отслеживать тип самостоятельно.

Одним из решений здесь будет иметь базовый класс, от которого наследуются все ваши объекты, и приведение void* к этому типу.Оттуда может возникнуть обычный полиморфизм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...