Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类之间的关系-继承和组合_C++_Inheritance_Relationship_Composition - Fatal编程技术网

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

C++ 类之间的关系-继承和组合,c++,inheritance,relationship,composition,C++,Inheritance,Relationship,Composition,我正在做一个游戏,斯内克。我对类之间的关系有问题,我真的不明白为什么 我有三门课: 蛇-蛇类 食物-蛇吃的食物 对象-具有成员:宽度、高度、posX和posY 这些关系是: Snake具有来自类对象的无限数量的对象。每个对象都是蛇的一个块。在snake宣言中,我有以下几点: Object **blocks; 然后,在snake构造函数中,我为块创建了一个对象数组。不用担心这个部分,我已经测试了Snake,并使它顺利运行了几个街区。蛇不是主要问题 然后我尝试对Food类进行继承,只要我只使

我正在做一个游戏,斯内克。我对类之间的关系有问题,我真的不明白为什么

我有三门课:

  • 蛇-蛇类
  • 食物-蛇吃的食物
  • 对象-具有成员:宽度、高度、posX和posY
这些关系是: Snake具有来自类对象的无限数量的对象。每个对象都是蛇的一个块。在snake宣言中,我有以下几点:

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。你是否使用包含防护装置?不,这意味着你必须停止手动操作并显示一些真实代码。将你所拥有的减少到你能创建的最小的例子中,这个例子仍然显示了问题似乎是错误的。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