c++ Include语句包含其自身

soat7uwm  于 2022-11-27  发布在  其他
关注(0)|答案(3)|浏览(216)

我正在用C编写一个项目,但我是Java的原生用户,几乎没有C经验。我遇到的错误是Cell和CellRenderer都包含了对方,但我不知道如何修复这个错误,因为它们都使用了对方。如果我删除#include,我会得到关于Cell的错误,但如果我保留它,除了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);
}
};

任何帮助都将不胜感激

bnlyeluc

bnlyeluc1#

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

  1. Visual Studio支援#pragma once。请将它放在信头的第一行。
    1.所有的编译器都有预处理器。用
#ifdef ...
  #define ...

   other include, class declaration, etc...

  #endif

将...替换为文件的唯一标识符;例如,我经常使用一个约定:

_filenameinlowercase_h_
noj0wjuj

noj0wjuj2#

如果您已经有一个头文件保护,请确保您没有错误地在其中包含相同的头文件。

示例

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

#endif
gr8qqesn

gr8qqesn3#

提示较大的相关问题。有时拼写可能是关闭的,它可以麻烦地看到哪里是设置不正确的,如果你有一个大项目与许多包含文件。
我发现一次编译一个文件可以识别include设置不正确的地方。

相关问题