soiran
@soiran
Разработчик, Художник

Что делать, если два класса используют друг друга?

Столкнулся с такой ситуацией, что класс поля и класс змейки используют друг друга, т.к. змейка изменяет матрицу поля, а поле создает цикл их передвижение(а также передает им события нажатия биндов). Но я никак не могу успокоить компилятор, потому-что в заголовках этих классов инклюдятся они же сами друг у друга. Как сделать так, чтобы всё это работало?

field.h
#include <vector>
#include "snake.h"


class Field {
    public:
        std::vector<std::vector<int>> matrix;
        std::vector<Snake*> snakes;
        int w, h;
        bool hasWalls = false;
        Field() {};
        Field(int w, int h) {};
        //
        // Returns all empty tile coordinates.
        //
        std::vector<std::pair<int, int>> getEmptyTiles() {};
        //
        // Placing food tile in random place.
        //
        void generateFood() {};
        //
        // Creating border of walls for matrix.
        //
        void generateWalls() {};
        //
        // Set empty tile for specific place.
        //
        void clear(int x, int y) {};
        //
        // Set any type of tile for specific place.
        //
        void set(int x, int y, int t) {};
        //
        // Returns tile at specific place.
        //
        int at(int x, int y) {};
        //
        // Start the game at current field.
        //
        void render(float pixelSize) {};
};

snake.h
#include <vector>
#include "field.h" // на данном моменте компилятор понимает, что что-то идет не так
#include "enums.h"


class Snake {
    public:
        std::vector<std::pair<int, int>> tiles;
        Field& field;
        int x, y;
        int length = 1;
        int direction, score = 0;
        bool alive = true;
        Snake(Field & f, int x, int y, int startLength) : field(f) {};
        //
        //  Add tile to snake at absolute position.
        //
        void add(int x, int y) {};
        //
        //  Change the direction of snake.
        //
        void rotate(int d) {};
        //
        //  Add tiles to tail.
        //
        void grow() {};
        //
        //  Move snake by it direction.
        //
        void shift() {};
};
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 2
Chronicler
@Chronicler
Программист
Допишите в начала каждого заголовочного файла директиву #pragma once
Ответ написан
maaGames
@maaGames
Погроммирую программы
forward declaration для классов сделать. И почитать, что это такое.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы