C ++ необъявленный идентификатор - PullRequest
3 голосов
/ 25 февраля 2012

Я хочу создать игру о морских сражениях. У меня есть два класса: Корабль и Клетка.

#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 ]

3 голосов
/ 25 февраля 2012

Что ж, ваша проблема заключается в том, что когда вы включаете MCell.h, вы включаете MShip.h, который ссылается на Cell, определенный в MCell.h.Однако MShip.h ссылается на MCell.h, который не будет включен из-за прагмы.Если бы однажды прагмы не было, вы бы получили бесконечный цикл, который бы переполнял ваш компилятор ...

Вместо этого вы могли бы использовать прямое объявление.

, то есть удалить #include"MCell.h" из MShip.h и замените его просто "классом Cell";Все ваши проблемы с циркулярными ссылками исчезнут:)

1 голос
/ 25 февраля 2012

Вам необходимо заранее объявить классы.

Ship.h

class Cell; //forward declaration
class Ship 
{
   //....
};

Cell.h

class Ship; //forward declaration
class Cell
{
   //....
};

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

1 голос
/ 25 февраля 2012

Ваши заголовочные файлы зависят друг от друга. Однако один из них должен быть прочитан раньше другого. Поэтому вам нужно переписать один из них (или оба), чтобы не зависеть от другого. Вы можете сделать это, объявив классы вперед, вместо того, чтобы включать заголовочный файл, который их определяет.

Так что в MShip.h вы должны поместить объявление class Cell; вместо того, чтобы включать MCell.h и / или наоборот.

...