包括两个文件之间的冲突C ++

时间:2018-06-27 10:16:40

标签: c++ include

我遇到了碰撞问题。我的意思是在我的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

3 个答案:

答案 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