调用由void指针引用的对象的函数
Call a function of an object referenced by a void Pointer
我有一个这样的函数:
void something(void *obj)
{
obj->Set();
}
编译器说,解引用运算符的左边必须是指向类/结构/联合/泛型的指针(从德语翻译过来,不确定措辞)。
这个想法是,无论传递给something
什么,我都想调用obj的something
函数。确保它具有此功能。我怎样才能做到这一点?
--编辑--
我开始研究一个现有的软件,它有超过100个数据类型类。在代码的一部分中,有一个大的switch语句,它根据id创建其中一个类的实例,并为该类调用Set函数。现在我想并行执行多个这样的调用,正因为如此,我想将->Set()调用引入一个单独的函数,然后我可以在新线程中调用它。遗憾的是,这里没有中产阶级,我不能在"大局"上改变太多。最好的方法是什么?
C++不允许这样做(有充分的理由:即使你可以确保对象总是有一个函数,C++也不能,因为你可能会犯错误,C++也有理由不信任你)。
正确的方法是使用一个公共基类,该基类为您要在此处使用的所有类型定义了此方法,然后使用该公共基类作为此函数的参数。
或者,如果在编译时知道这里使用的是哪种类型,那么适当的实现使用模板:
template <typename T>
void f(T const& obj) {
obj.something();
}
无论您做什么,void*
都不适合。在C++中,它的合法使用案例非常罕见。
您需要一个基类或接口来处理传递到doSth
:中的任何内容
class Base
{
public:
virtual void something() = 0; //override this in derived classes
}
doSth(Base* obj)
{
obj->something();
}
您也可以将void*
转换回原始类型:
doSth(void* obj)
{
((Base*)obj)->something();
}
但通过CCD_ 6作为参数表明存在错误设计。你到底想达到什么目的?
您需要使用以下函数实现纯虚拟基类:
class Base
{
public:
virtual ~Base(){}
virtual void somefunction()=0;
}
class Derived1: public Base
{
public:
void somefunction()
{
//do something
}
}
class Derived2: public Base
{
public:
void somefunction()
{
//do something
}
}
然后使用动态铸造从虚空中获得基地*
doSth(void *obj)
{
Base *bobj=dynamic_cast<Base*>(obj);
if ( bobj )
bobj->somefunction();
}
或者更简单:
doSth(Base *obj)
{
obj->somefunction();
}
用法如下:
Base *p1 = new Derived1();
Base *p2 = new Derived2();
doSth(p1); // cals somefunction in Derived1 class
doSth(p2); // cals somefunction in Derived2 class
doSth( (*someFunc)() ) {
obj->*someFunc();
}
通话内容如下:
doSth( &function );
在不同的类之间传递函数指针时,应该为每个函数指针创建一个typedef,并为每个函数标识符使用限定符。
只需定义一个接口,该接口列出了要由指针引用的所有对象的所有函数,但该指针的类型不应为void,而应为该接口的名称。
然后,您将能够通过该指针调用您想要的每个对象的每个函数,但请确保对象的所有结构和类都实现了接口的所有函数!
在每个结构和类的头中写入: public
和接口名称也很重要!
- 如何创建对象函数指针C++映射?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 如何将对象函数的实例传递给另一个函数
- 调用模板函数的问题"No matching function for call"参数:迭代器、对象函数
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 将对象函数转换为函数指针
- 非对象函数/类函数C++
- 线程对象函数 C++
- C 将成员对象函数分配给类成员功能
- 使用基本指针调用派生对象函数
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- C++类对象函数
- 对对象::函数的未定义引用
- 无法弄清楚将多个对象函数作为单独的线程调用的语法
- 在提升作用域出口中调用对象函数
- 使用基指针来使用派生对象函数
- 在for_each lambda 中调用对象函数
- C++:: 模板函数 - 从对象函数获取对象的地址
- Qt5 未解析的外部静态元对象函数
- 通过变量使用对象和对象函数