3

我想制作一款海战游戏。我有两个课程:Ship 和 Cell。

#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

代码有什么问题?

4

3 回答 3

5

那么您的问题在于,当您包含 MCell.h 时,您包含了引用 MCell.h 中定义的 Cell 的 MShip.h。但是,MShip.h 指的是 MCell.h,由于 pragma 一次,它不会被包含在内。如果 pragma once 不存在,那么你会得到一个无限循环,它会堆栈溢出你的编译器......

相反,您可以使用前向声明。

即从 MShip.h 中删除 #include "MCell.h" 并将其替换为简单的 "class Cell;" 你所有的循环引用问题都会消失:)

于 2012-02-24T22:56:32.173 回答
1

您的头文件相互依赖。然而,其中一个必须在另一个之前阅读。因此,您需要重写其中一个(或两个)以不依赖于另一个。您可以通过前向声明类而不是包含定义它们的头文件来做到这一点。

所以在 MShip.h 中你应该声明class Cell;而不是包含 MCell.h 和/或反之亦然。

于 2012-02-24T22:55:56.203 回答
1

您需要转发声明类。

船舶.h

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

细胞.h

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

并删除圆形夹杂物。您不需要在另一个标题中包含一个标题,因为您使用的不是完整类型,而是指针。当您使用该类型的具体对象时,需要完整的类定义。在指针的情况下,你不需要。

于 2012-02-24T22:55:59.770 回答