gpt4 book ai didi

c++ - 类之间的关系——继承和组合

转载 作者:太空宇宙 更新时间:2023-11-04 14:11:27 25 4
gpt4 key购买 nike

<分区>

我正在开发一款游戏,贪吃蛇。我对类之间的关系有疑问,我真的不明白为什么。

我有这三个类:

  • Snake - 蛇类。
  • 食物 - 蛇吃的食物
  • 对象 - 具有成员:宽度、高度、posX 和 posY

这些是关系:Snake 有无限数量的来自 Object 类的对象。每个对象都是蛇的 block 。因此在 snake 声明中我有:

Object **blocks; 

然后,在 snake 构造函数中,我为 block 创建了一个对象数组。不要为这部分操心,我已经测试了 Snake 并使其在几个 block 中顺利运行。蛇不是主要问题。

然后我尝试对 Food 类进行继承,只要我只使用头文件而不使用 cpp 文件,它就可以工作:

//Header file for Food
#include "Object.h"
class Food : Object { ............ };

到目前为止一切顺利,但是!,一旦我写了一行:#include "Food.h"for food.cpp 并尝试编译,编译器在 Snake 中发现错误(!?)。对于以下行,我有一个错误提示“错误:“对象”不是类型上的名称”:

Object **blocks;

这是否意味着我不能将一个类 (Object) 同时用于继承和组合?

编辑:我有太多代码,没有时间缩短所有代码。这是 Object.h 的代码(我没有 object.cpp 文件,因为还不需要):

#ifndef OBJECT_H
#define OBJECT_H

#include "stdafx.h"
#include "Snake.h"

class Object {
private:
int posX;
int posY;
int height;
int width;

public:
//Get functions
int getPosX() const { return this->posX; }
int getPosY() const { return this->posY; }
int getHeight() const { return this->height; }
int getWidth() const { return this->width; }

//Set functions
void setPosX(int x) { this->posX = x; }
void setPosY(int y) { this->posY = y; }
void setHeight(int h) { this->height = h; }
void setWidth(int w) { this->width = w; }
};

#endif //OBJECT_H

这是 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

下面是 Food.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

我希望代码不要太多。它主要只是不重要的成员变量和设置、获取函数。如果您在这里找不到任何错误,那么我稍后会回来提供更多信息。感谢您的帮助!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com