我有这样的代码
void Field::tick() {
this->snake.tick(this);
}
,其中this->snake
是Snake
类的类属性。Snake
类采用tick()
方法中的this
参数:
void tick(Field field);
当然,在Snake
的头文件中,我导入了Field.h
。
现在问题是在将字段类中的this
的实例传递给Snake
中的tick()
方法时,我得到以下错误:
c:/Users/x/Documents/NetBeansProjects/snake/snake .h:12:15: out: Field没有被声明c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp: In memberfunction void Field::tick():c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27: 4:没有匹配的函数调用snake::tick(Field&)c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27:注:候选是:c:/Users/x/Documents/NetBeansProjects/snake/snake .h:12:10: note: void snake::tick(int)c:/Users/x/Documents/NetBeansProjects/snake/snake .h:12:10:注意:未知参数1从Field到int的转换
有什么建议吗?
在文件Snake.h中,在声明Snake
类之前声明Field
类:
class Field;
class Snake
{
...
void tick(Field* field);
...
};
这应该可以修复编译错误,因为您在类Snake
中使用了类Field
的指针。所以编译器只需要知道这样的类存在,但它不需要知道该类的任何内容。如果您使用的是实例,那么您将得到一个编译错误,因为编译器需要知道该实例的大小。
因此,在声明类Field
之前声明类Snake
的替代选项将无法编译,因为您在类Snake
中使用了类Field
的实例,并且编译器需要知道该实例的大小:
class Snake;
class Field
{
...
Snake snake;
...
};