调用由void指针引用的对象的函数

Call a function of an object referenced by a void Pointer

本文关键字:对象 函数 引用 指针 void 调用      更新时间:2023-10-16

我有一个这样的函数:

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方法可以将函数指针作为参数。
doSth( (*someFunc)() ) {
 obj->*someFunc();
}

通话内容如下:

doSth( &function );

在不同的类之间传递函数指针时,应该为每个函数指针创建一个typedef,并为每个函数标识符使用限定符。

只需定义一个接口,该接口列出了要由指针引用的所有对象的所有函数,但该指针的类型不应为void,而应为该接口的名称。

然后,您将能够通过该指针调用您想要的每个对象的每个函数,但请确保对象的所有结构和类都实现了接口的所有函数!

在每个结构和类的头中写入: public和接口名称也很重要!