我有这个代码

void Field::tick() {
    this->snake.tick(this);
}


其中this->snakeSnake类的类属性。
Snake类在this方法中采用tick()参数:

void tick(Field field);


当然,在Snake的头文件中,我导入了Field.h

现在,问题出在将字段类中的this实例传递给tick()中的Snake方法时,出现以下错误:

c:/Users/x/Documents/NetBeansProjects/snake/Snake.h:12:15:fout:尚未声明字段
c:/用户/x/Documents/NetBeansProjects/snake/Field.cpp:在成员函数中void Field :: tick():
c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27:fout:没有匹配的函数可以调用Snake :: tick(Field&)
c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27:注意:候选人是:
c:/用户/x/Documents/NetBeansProjects/snake/Snake.h:12:10:注意:void Snake :: tick(int)
c:/Users/x/Documents/NetBeansProjects/snake/Snake.h:12:10:注意:参数1从Field到Int没有已知的转换

有什么建议么?

最佳答案

在文件Snake.h中,在声明类Field之前声明类Snake

class Field;

class Snake
{
    ...
    void tick(Field* field);
    ...
};


这应该可以解决编译错误,因为您在类Field中使用了类Snake的指针。因此,编译器仅需要知道此类存在,而无需了解有关该类内容的任何信息。如果您使用的是实例,则会出现编译错误,因为编译器需要知道该实例的大小。

因此,在声明类Snake之前声明类Field的替代选项将不会编译,因为您正在使用类Field中的类Snake的实例,并且编译器需要知道该类的大小。实例:

class Snake;

class Field
{
    ...
    Snake snake;
    ...
};

10-08 07:11