Void Pointers:如何用作通用类指针?

时间:2014-03-12 12:12:56

标签: c++ pointers void-pointers

我有两个cpp类,让我们说ClassA和ClassB。我有两个指针,指向那些类,让我们说指针A和指针B.现在我有一个通用的void *指针,我想根据某些条件指向ClassA或ClassB。在这种情况下,获取错误错误C2227:左边的' - > GetPosition'必须指向class / struct / union / generic类型的类型是' void *'。

如何避免这种错误?

ClassA { 
   void GetPosition();
}

ClassB { 
   void GetPosition();
}

main() {

   ClassA  *pointerA;
   ClassB  *pointerB;
   void    *generic_pointerAorB;

   pointerA = GetAddrOfClassA();
   pointerB = GetAddrOfClassB()

   generic_pointer = pointerA;

   //********************** error at the code below ******************************
   //error C2227: left of '->GetPosition' must point to class/struct/union/generic type. 
   //type is 'void *'

   generic_pointer->GetPosition(); 

   //*****************************************************************************



}

3 个答案:

答案 0 :(得分:9)

void指针没有名为GetPosition的方法,并且指针本身可能无法知道它指向您的某个类,因为它存储内存地址,而不是类型。你需要使用一个演员:

reinterpret_cast<ClassA*>(generic_pointerAorB)->GetPosition();

但说实话,你应该做一些其他事情 - 从一些具有virtual GetPosition()方法的基类派生类,然后声明一个指向基类的指针。

class Base{
   virtual void GetPosition();

ClassA: public Base { 
   void GetPosition();
}

ClassB: public Base { 
   void GetPosition();
}

main(){
   Base* basePointer;
   // <-- other code here
   basePointer = pointerA;
   basePointer->GetPosition();

答案 1 :(得分:2)

您无法取消引用void *类型。

原因很简单,编译器无法通过void *类型知道generic_pointer实际指向了多少内存(在您的情况下)。

以这种方式使用:

((ClassA*)generic_pointer)->GetPosition();

或等效,

((ClassB*)generic_pointer)->GetPosition();

答案 2 :(得分:1)

如果您使用的是C ++,更好的方法是定义一个虚拟基类

class Base
{
public:
   virtual void GetPosition();
};

然后从Base

派生ClassA和ClassB
class ClassA: public Base
{
   void GetPosition();
}

class ClassB: public Base
{
   void GetPosition();
}

然后在你的程序中而不是声明void *,使用Base *;

Base* generic_pointer;

然后代替投射,

generic_pointer->GetPosition();