包含声明包括其自身

时间:2013-08-07 04:17:40

标签: c++ include

我正在使用c ++开发一个项目,但我是Java的本地人,并且几乎没有c ++经验。我遇到的错误是Cell和CellRenderer都互相包含,但我不知道如何解决这个问题,因为他们互相使用。如果我删除#include,我会得到单元格的错误,但如果我保留它,错误就会消失,除非Cell包含它自己。这是我的代码:

#include <string>
#include <iostream>
#include <allegro5\allegro.h>
#include "Cell.h"
#include "Renderer.h"


using namespace std;


class CellRenderer: public Renderer{
Cell * cell;
ALLEGRO_BITMAP * image;
public:

CellRenderer(Cell * c)
{
    cell = c;
    image = cell->getImage();
}

void render(int x, int y)
{
    al_draw_tinted_scaled_bitmap(image, cell->getColor(),0,0,al_get_bitmap_width(image),al_get_bitmap_height(image),x-cell->getRadius(),y-cell->getRadius(),cell->getRadius()*2,cell->getRadius()*2,0);
}

bool doesRender(int x, int y, int wid, int ht)
{
    int cellX = cell->getX();
    int cellY = cell->getY();
    int radius = cell->getRadius();
    return cellX>x-radius&&cellX<x+wid+radius&&cellY>y-radius&&cellY<y+ht+radius;
}
}

class Cell{
public:
bool doesRender(int x, int y, int wid, int ht)
{
    return renderer->doesRender(x,y,wid,ht);
}

void render(int x, int y)//renders with center at x,y
{
    renderer->render(x,y);
}
};

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

你需要用guard来包围你写的所有头文件。 有两个解决方案可以做到这一点,但只有第二个才能真正适用于所有编译器。

  1. Visual Studio支持#pragma once。把它放在标题的第一行。

  2. 所有编译器都有一个预处理器。使用

    包围头文件中的所有文本
      #ifdef ...
      #define ...
    
       other include, class declaration, etc...
    
      #endif
    
  3. 用文件的唯一标识符替换...;例如,我经常使用作为惯例:

     _filenameinlowercase_h_
    

答案 1 :(得分:0)

如果你已经有一个标题保护,请确保你没有错误地包含相同的标题文件。

示例

#ifndef EXAMPLE_H_
#define EXAMPLE_H_
.
.
.
#include Example.h   //It should be removed
.
.

#endif