我有两个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();
//*****************************************************************************
}
答案 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和ClassBclass ClassA: public Base
{
void GetPosition();
}
class ClassB: public Base
{
void GetPosition();
}
然后在你的程序中而不是声明void *,使用Base *;
Base* generic_pointer;
然后代替投射,
generic_pointer->GetPosition();