C++ 类之间的关系-继承和组合
我正在做一个游戏,斯内克。我对类之间的关系有问题,我真的不明白为什么 我有三门课:C++ 类之间的关系-继承和组合,c++,inheritance,relationship,composition,C++,Inheritance,Relationship,Composition,我正在做一个游戏,斯内克。我对类之间的关系有问题,我真的不明白为什么 我有三门课: 蛇-蛇类 食物-蛇吃的食物 对象-具有成员:宽度、高度、posX和posY 这些关系是: Snake具有来自类对象的无限数量的对象。每个对象都是蛇的一个块。在snake宣言中,我有以下几点: Object **blocks; 然后,在snake构造函数中,我为块创建了一个对象数组。不用担心这个部分,我已经测试了Snake,并使它顺利运行了几个街区。蛇不是主要问题 然后我尝试对Food类进行继承,只要我只使
- 蛇-蛇类李>
- 食物-蛇吃的食物
- 对象-具有成员:宽度、高度、posX和posY
Object **blocks;
然后,在snake构造函数中,我为块创建了一个对象数组。不用担心这个部分,我已经测试了Snake,并使它顺利运行了几个街区。蛇不是主要问题
然后我尝试对Food类进行继承,只要我只使用头文件而不使用cpp文件,该类就可以工作:
//Header file for Food
#include "Object.h"
class Food : Object { ............ };
到目前为止还不错,但是!,只要我写一行:#在Food.cpp中包含“Food.h”并尝试编译,编译器就会在Snake(!?)中发现错误。我有一个错误,在下面的一行中说“error:”Object“不是类型上的名称”:
Object **blocks;
这是否意味着我不能将类(对象)同时用于继承和组合
编辑:我有太多的代码,没有时间缩短所有的代码。以下是Object.h的代码(我没有Object.cpp文件,因为还不需要):
以下是Snake.h的代码:
#ifndef SNAKE_H
#define SNAKE_H
#include "Object.h"
#include "stdafx.h"
class Snake {
public:
enum Direction { Left, Right, Up, Down };
private:
Object **blocks;
int nrOfBlocks;
float speed;
int frontBlock;
Direction direction;
sf::Image blockImg;
sf::Sprite blockSprite;
public:
Snake();
~Snake();
//Get functions
int getNrOfBlocks() const { return this->nrOfBlocks; }
float getSpeed() const { return this->speed; }
Direction getDirection() const { return this->direction; }
sf::Image getBlockImg() const { return this->blockImg; }
sf::Sprite getSprite() const { return this->blockSprite; }
//Set functions
void setNrOfBlocks(int nrOfBlocks) { this->nrOfBlocks = nrOfBlocks; }
void setSpeed(float speed) { this->speed = speed; }
void setDirection(Direction direction) { this->direction = direction; }
void setImage(sf::Image image) { this->blockImg = image; }
void setBlockSprite(sf::Sprite sprite) { this->blockSprite = sprite; }
void move(int n);
void newFrontBlock();
void changeDir(Direction dir);
sf::Sprite doSprite(int n);
};
#endif //SNAKE_H
这是食物的代码。h:
#ifndef FOOD_H
#define FOOD_H
#include "Object.h"
#include "stdafx.h"
class Food : public Object {
private:
int points;
int timeExperation;
sf::Image image;
sf::Sprite sprite;
public:
Food();
int getPoint() const { return this->points; }
int getTimeExperation() const { return this->timeExperation; }
void setPoints(int points) { this->points = points; }
void setTimeExperation(int timeExp) { this->timeExperation = timeExp; }
};
#endif //FOOD_H
我希望代码不要太多。它主要是不重要的成员变量和set-,get函数。
如果您在这里找不到任何错误,那么我将稍后再提供更多错误。谢谢你的帮助 找到了错误。由于某种原因,很可能是一个测试或错误,我意外地将#include“Snake.h”包含在Object.h中,就像我同时将#include“Object.h”包含在Snake.h中一样 现在不知道为什么您只能将一个文件包含在另一个文件中,而不能以另一种方式也,但是,我只是从Object.h中删除了#include“Snake.h”,它现在就可以工作了!最奇怪的是,我完全不明白为什么#include“Food.h”for Food.cpp触发了这个错误。如果有人知道这一点,请回复,我想从我的失误中学习
无论如何,感谢所有回答的人 我不建议给类命名
对象
。这可能会造成比您预期的更多的混乱。您正在做的事情没有任何错误,可能是您的头/源设置错误。请显示更多的Object.h、Food.h和Snake.cpp。你是否使用包含防护装置?不,这意味着你必须停止手动操作并显示一些真实代码。将你所拥有的减少到你能创建的最小的例子中,这个例子仍然显示了问题对于数组而言,code>似乎是错误的。OT:您的意图是将对象
私下继承吗?看到实际的对象
声明可能会很有说服力。
#ifndef FOOD_H
#define FOOD_H
#include "Object.h"
#include "stdafx.h"
class Food : public Object {
private:
int points;
int timeExperation;
sf::Image image;
sf::Sprite sprite;
public:
Food();
int getPoint() const { return this->points; }
int getTimeExperation() const { return this->timeExperation; }
void setPoints(int points) { this->points = points; }
void setTimeExperation(int timeExp) { this->timeExperation = timeExp; }
};
#endif //FOOD_H