Отношения между классами — как наследование, так и состав

У меня есть игра, над которой я работаю, Снейк. У меня проблемы с отношениями между классами, и я не очень понимаю, почему.

У меня есть эти три класса:

  • Змея — класс змей.
  • Еда — еда, которую ест змея
  • Объект — имеет членов: ширина, высота, posX и posY

Это отношения:
Змея имеет неограниченное количество объектов из класса Object. Каждый объект является блоком для змеи. Поэтому в объявлении змеи я имею:

Object **blocks;

Затем в конструкторе змей я создаю массив объектов для блоков. Не беспокойтесь об этой части, я протестировал Snake и сделал так, чтобы он работал с несколькими блоками. Змея не главная проблема.

Затем я пытаюсь сделать наследование для класса Food, который работает до тех пор, пока я использую только заголовочный файл, а не cpp-файл:

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

Пока все хорошо, но !, как только я пишу одну строчку: #include «Food.h» для 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.
Если вы не можете найти никаких ошибок здесь, я вернусь с более позже. Спасибо за вашу помощь!

1

Решение

Нашел ошибку. По какой-то причине, вероятно, в качестве теста или ошибки, я случайно включил #include «Snake.h» в Object.h, так как в то же время я включил #include «Object.h» в Snake.h

Не теперь, почему вы можете включить только один файл в другой, а не также наоборот, но я просто удалил #include «Snake.h» из Object.h и теперь он работает! Самая странная вещь, которую я совсем не понимаю, это то, почему #include «Food.h» для food.cpp вызвало ошибку. Если кто-то знает это, пожалуйста, ответьте, я хочу учиться на своих ошибках.

В любом случае, спасибо всем, кто ответил!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector