C++ C++;通行证;这";实例到类中的属性

C++ C++;通行证;这";实例到类中的属性,c++,pointers,C++,Pointers,我有这个密码 void Field::tick() { this->snake.tick(this); } 其中this->snake是snake类的类属性。 Snake类在tick()方法中获取此参数: void tick(Field field); 当然,在Snake的头文件中,我导入了Field.h 现在的问题是,在将field类中的this的实例传递给Snake中的tick()方法时,出现以下错误: c:/Users/x/Documents/NetBeansProjec

我有这个密码

void Field::tick() {
    this->snake.tick(this);
}
其中
this->snake
snake
类的类属性。
Snake
类在
tick()
方法中获取
参数:

void tick(Field field);
当然,在
Snake
的头文件中,我导入了
Field.h

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

c:/Users/x/Documents/NetBeansProjects/snake/Snake.h:12:15: fout: Field has not been declared c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp: In memberfunction void Field::tick(): c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27: fout: no matching function for call to Snake::tick(Field&) c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27: note: candidate is: 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: note: no known conversion for argument 1 from Field to int c:/Users/x/Documents/NetBeansProjects/snake/snake.h:12:15:fout:字段尚未声明 c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:In memberfunction void Field::tick(): c:/Users/x/Documents/NetBeansProjects/snake/Field.cpp:14:27:fout:对snake的调用没有匹配的函数::勾选(字段&) 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从字段到int的转换未知 有什么建议吗?

在Snake.h文件中,在声明class
Snake
之前声明class
字段

class Field;

class Snake
{
    ...
    void tick(Field* field);
    ...
};
这将修复编译错误,因为您正在类
Snake
中使用类
字段
指针。因此,编译器只需要知道此类存在,但不需要知道有关该类内容的任何信息。如果您使用的是一个实例,那么您将得到一个编译错误,因为编译器需要知道该实例的大小

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

class Snake;

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

他说他将
字段
头文件导入
Snake
one我认为字段和Snake之间存在循环依赖关系,因此他需要作为Barak Manos进行正向声明suggested@CoffeeandCode:但是类
字段
有一个类型为
Snake
的成员,因此,两个类都需要相互了解。因此,其中至少有一个应该使用“空”声明,例如
类字段
(它不能是
类Snake;
在file Field.h中,因为它使用的是类型为
Snake
)的实际实例。@elaurens是的,但是循环依赖性与此答案建议的相反(如果
字段
Field.h
中正确定义),谢谢!这就解决了问题。但有一个问题是,循环依赖是否被认为是一种良好的实践?或者它只是导致了更多的问题?第一个错误表明您实际上没有包含
字段.h
头文件(或者不正确)