为什么我不能在l->set(new StateB);
中创建StateA
? (此行注释如下)
它说:
main.cpp: In member function ‘virtual void StateA::writeName(Lap*, char*)’:
main.cpp:19:4: error: invalid use of incomplete type ‘struct Lap’
main.cpp:3:7: error: forward declaration of ‘struct Lap’
但我不能解决:(
#include <stdio.h>
class Lap;
class State;
class StateB;
class StateA;
class State { public:
virtual void writeName(Lap *l, char *str) = 0;
};
class StateB : public State { public:
void writeName(Lap *l, char *str) {
printf("%s B\n", str);
}
};
class StateA : public State { public:
void writeName(Lap *l, char *str) {
printf("%s A\n", str);
//l->set(new StateB);
}
};
class Lap { public:
State *ss;
Lap(){
printf("[Lap]\n");
set(new StateA);
}
void set(State *s){
ss = s;
}
void writeName(char *str){
ss->writeName(this, str);
}
};
int main()
{
printf("\n\n");
Lap lap;
lap.writeName((char*)"Fulano");
lap.writeName((char*)"Fulano");
printf("\n\n");
return 0;
}
最佳答案
问题是前向声明
class Lap;
仅告诉编译器存在这样的类,并允许您声明指向
Lap
的指针,但不能为编译器提供足够的信息来处理任何Lap
方法调用。因此,在尝试使用其方法之前,需要完全声明
Lap
。对于给定的代码,这无法在单个文件中完成,因为
Lap
会执行new StateA
,而StateA
会调用Lap
上的方法-循环依赖项。您需要将至少一个(最好是所有)的声明移到头文件中,并在需要时包括头文件。然后,在任何一个类的定义尝试使用另一个类中的方法之前,编译器将了解这些类的完整接口详细信息。
关于c++ - 使用类参数编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10711653/