C ++从两个类中确定void *的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++从两个类中确定void *的类型相关的知识,希望对你有一定的参考价值。

我正在使用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);
        }
    }
}

谢谢!

答案

没有在C ++中没有可移植的方法。

一旦你转向void*const void*,你告诉编译器你将自己跟踪类型。

这里的一个解决方案是拥有一个基类,所有对象都从该基类继承,并将void*转换为该类型。从那里,定期多态可以接管。

另一答案

不要将对象本身添加为void*客户端数据,而是添加指向具有足够成员来查找对象的结构的指针。例如,容纳对象的容器的一些标识符和容器的索引。

以上是关于C ++从两个类中确定void *的类型的主要内容,如果未能解决你的问题,请参考以下文章

μC/OS-II任务代码

类中的异常处理和 C# 的代码隐藏

void 类型不能用来初始化char* 类型的实体

void 类型不能用来初始化char* 类型的实体

从片段类中的对话框添加项目到recyclerview。

C ++如何从具有不同返回类型的接口多重继承?