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文件中,在声明classSnake
之前声明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
头文件(或者不正确)