C++ необъявленный идентификатор
Я хочу создать морскую битву. У меня есть два класса: Корабль и Клетка.
#pragma once
#include"stdafx.h"
#include"Globals.h"
#include<vector>
#include"MCell.h"
class Ship
{
private:
int lenght;
int oriantation;
vector<Cell*> cells;
vector<Cell*> aroundCells;
...
#pragma once
#include<vector>
#include"MShip.h"
class Cell
{
private:
bool haveShip;
bool selected;
bool around;
int x;
int y;
Ship* ship;
И у меня есть много ошибок, таких как те:
1>projects\seewar\seewar\mship.h(13): error C2065: 'Cell' : undeclared identifier
1>projects\seewar\seewar\mship.h(13): error C2059: syntax error : '>'
1>projects\seewar\seewar\mship.h(14): error C2065: 'Cell' : undeclared identifier
Что не так с кодом?
3 ответа
Ваша проблема заключается в том, что когда вы включаете MCell.h, вы включаете MShip.h, который ссылается на Cell, определенный в MCell.h. Однако MShip.h ссылается на MCell.h, который не будет включен из-за прагмы. Если бы однажды прагмы не было, вы бы получили бесконечный цикл, который переполнял бы ваш компилятор...
Вместо этого вы можете использовать предварительную декларацию.
т.е. удалите #include "MCell.h" из MShip.h и замените его просто "class Cell;" Все ваши проблемы с циркулярными ссылками исчезнут:)
Вы должны заранее объявить классы.
Ship.h
class Cell; //forward declaration
class Ship
{
//....
};
Cell.h
class Ship; //forward declaration
class Cell
{
//....
};
и удалите круглое включение. Вам не нужно включать один заголовок в другой, так как вы работаете не с полными типами, а с указателями. Полное определение класса требуется при использовании конкретных объектов типа. В случае с указателями - нет.
Ваши заголовочные файлы зависят друг от друга. Однако один из них должен быть прочитан раньше другого. Поэтому вам нужно переписать один из них (или оба), чтобы не зависеть от другого. Вы можете сделать это, объявив классы вперед, вместо того, чтобы включать заголовочный файл, который их определяет.
Так что в MShip.h вы должны поместить объявление class Cell;
вместо включения MCell.h и / или наоборот.