我遇到了碰撞问题。我的意思是在我的A.h中需要包含B.h,但是在B.h中我需要包含A.h,所以我不知道如何解决它。
Interface.h
#ifndef _INTERFACE_H
#define _INTERFACE_H
#include <SDL.h>
#include <vector>
#include "Widget.h"
class Interface
{
public:
Interface(SDL_Rect &r);
~Interface();
private:
SDL_Rect m_rect;
std::vector<Widget*> m_widgets;
};
#endif
Widget.h
#ifndef _WIDGET_H
#define _WIDGET_H
#include <SDL.h>
#include "Interface.h"
class Widget
{
public:
Widget(Interface *main, SDL_Rect &r);
~Widget();
private:
SDL_Rect m_rect;
Interface* m_master;
};
#endif
答案 0 :(得分:1)
由于您依靠指针,因此可以声明(而不是定义)类,并将头文件包括在cpp文件中:
#ifndef _INTERFACE_H
#define _INTERFACE_H
#include <SDL.h>
#include <vector>
class Widget; //See the swap from include to declaration?
class Interface
{
public:
Interface(SDL_Rect &r);
~Interface();
private:
SDL_Rect m_rect;
std::vector<Widget*> m_widgets;
};
#endif
在另一个标头中进行类似的交换。
答案 1 :(得分:1)
这不是“共谋”,而是循环依赖。
对于您而言,通过完全不包括头文件,可以轻松地非常解决,而仅使用类的 forward声明:
文件Interface.h
:
#ifndef INTERFACE_H
#define INTERFACE_H
#include <SDL.h>
#include <vector>
// No inclusion of Widget.h
// Forward declare the class instead
class Widget;
class Interface
{
public:
Interface(SDL_Rect &r);
~Interface();
private:
SDL_Rect m_rect;
std::vector<Widget*> m_widgets;
};
#endif
文件Widget.h
:
#ifndef WIDGET_H
#define WIDGET_H
#include <SDL.h>
// Don't include Interface.h
// Forward declare it instead
class Interface;
class Widget
{
public:
Widget(Interface *main, SDL_Rect &r);
~Widget();
private:
SDL_Rect m_rect;
Interface* m_master;
};
#endif
您当然需要在 source 文件中包含头文件。
还请注意,我已更改了包括卫兵的符号。在所有范围内,由“实现”(编译器和标准库)保留带下划线的字母符号和大写字母。有关详细信息,请参见this old question and its answers。
答案 2 :(得分:0)
编辑:Doctorlove更快。
在其中一个文件中使用前向声明:
#ifndef _INTERFACE_H
#define _INTERFACE_H
#include <SDL.h>
#include <vector>
#include "Widget.h"
class Widget;
class Interface
{.....
#endif