У меня есть игра, над которой я работаю, Снейк. У меня проблемы с отношениями между классами, и я не очень понимаю, почему.
У меня есть эти три класса:
Это отношения:
Змея имеет неограниченное количество объектов из класса 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.
Если вы не можете найти никаких ошибок здесь, я вернусь с более позже. Спасибо за вашу помощь!
Нашел ошибку. По какой-то причине, вероятно, в качестве теста или ошибки, я случайно включил #include «Snake.h» в Object.h, так как в то же время я включил #include «Object.h» в Snake.h
Не теперь, почему вы можете включить только один файл в другой, а не также наоборот, но я просто удалил #include «Snake.h» из Object.h и теперь он работает! Самая странная вещь, которую я совсем не понимаю, это то, почему #include «Food.h» для food.cpp вызвало ошибку. Если кто-то знает это, пожалуйста, ответьте, я хочу учиться на своих ошибках.
В любом случае, спасибо всем, кто ответил!
Других решений пока нет …