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

时间:2012-12-20 21:23:43

标签: c++ inheritance relationship composition

我正在玩一款游戏,Snake。我对课程之间的关系有疑问,我真的不明白为什么。

我有这三个类:

  • 蛇 - 蛇类。
  • 食物 - 蛇吃的食物
  • 对象 - 具有成员:width,height,posX和posY

这些是关系: Snake具有Object类中无限量的对象。每个物体都是蛇的块。在蛇声明中,我有:

Object **blocks; 

然后,在snake构造函数中,我为块创建了一个Object数组。不要理会这部分,我已经测试了Snake并使它顺利运行了几个块。 Snake不是主要问题。

然后我尝试为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

我希望这不是很多代码。它主要是非重要的成员变量和set-,get-functions。 如果你在这里找不到任何错误,我会稍后回来。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

发现错误。出于某种原因,我在意外地将一个测试或错误信息包含在Object.h中的#include“Snake.h”中,同时我在Snake.h中包含了#include“Object.h”

现在不要为什么你只能将一个文件包含在另一个文件中而不是反过来但是,我只是从Object.h中删除#include“Snake.h”并且它可以工作现在!最奇怪的事情和我完全不理解的是为什么food.cpp的#include“Food.h”触发了错误。如果有人知道这个请回复,我想通过我的错误来学习。

无论如何,感谢所有回答的人!