2012-02-24 2 views
3

바다 배틀 게임을 만들고 싶습니다. 두 가지 클래스가 있습니다 : 선박과 셀. 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를 포함 할 때 MCell.h에 정의 된 Cell을 참조하는 MShip.h를 포함한다는 것입니다. 그러나 MShip.h는 pragma 때문에 포함되지 않는 MCell.h를 참조합니다. pragma가 없으면 컴파일러 오버플로를 스택하는 inifinite 루프를 얻게됩니다 ...

대신 전달 선언을 사용할 수 있습니다.

즉, MShip.h에서 #include "MCell.h"를 ​​제거하고 간단히 "class Cell;"으로 바꾸십시오. 모든 순환 참조 문제가 없어집니다.

+0

나는 당신이 얼마나 슬픈지를 마쳤습니다. 하지만 새로운 오류가 발생했습니다 : matrix [i] [j] = new Cell (i, j); 1> c : \ users \ ostap \ documents \ visual 스튜디오 2010 \ projects \ seewar \ seewar \ mplane.h (32) : 오류 C2514 : '셀': 클래스에 생성자가 없습니다. –

+0

괜찮아요. 잘 작동합니다. 감사합니다. –

1

헤더 파일은 서로 다릅니다. 그러나 그들 중 하나는 다른 하나보다 먼저 읽어야합니다. 그래서 당신은 그들 중 하나 (또는 ​​둘 모두)를 다른 것에 의존하지 않고 다시 써야합니다. 클래스를 정의하는 헤더 파일을 포함하는 대신 클래스를 순방향 선언하여이를 수행 할 수 있습니다.

MShip.h에서 MCell.h를 포함하는 대신 class Cell; 선언을 넣거나 그 반대의 경우도 마찬가지입니다.

1

클래스를 선언해야합니다. Ship.h

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

Cell.h

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

및 원형을 포함 제거

. 전체 유형으로 작업하지 않기 때문에 하나의 헤더를 다른 헤더에 포함 할 필요는 없습니다. 유형의 구체적인 객체를 사용할 때는 전체 클래스 정의가 필요합니다. 포인터의 경우에는 그렇지 않습니다.