в том числе столкновение двух файлов с ++ - PullRequest
0 голосов
/ 27 июня 2018

У меня проблема с столкновением. Я имею в виду, что в моем 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 голосов
/ 27 июня 2018

РЕДАКТИРОВАТЬ: Doctorlove был быстрее.

использовать предварительную декларацию в одном из файлов:

#ifndef _INTERFACE_H
#define _INTERFACE_H

#include <SDL.h>
#include <vector>
#include "Widget.h"

class Widget;

class Interface
{.....

#endif
0 голосов
/ 27 июня 2018

Это не "коллапс", а круговая зависимость .

Для вашего случая это решается очень легко, вообще не включая заголовочные файлы, и использует только предварительные объявления из классов:

Файл 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

Вам, конечно, нужно включить файлы заголовков в ваши исходные файлы.


Также обратите внимание, что я изменил символы для ваших охранников. Символы с начальным подчеркиванием, за которым следует заглавная буква, зарезервированы во всех областях «реализацией» (компилятором и стандартной библиотекой). Подробнее см. этот старый вопрос и ответы на него .

0 голосов
/ 27 июня 2018

Поскольку вы полагаетесь на указатели, вы можете объявлять (а не определять) классы и включать заголовочные файлы в файлы 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

Сделайте аналогичный обмен в другом заголовке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...