Это не "коллапс", а круговая зависимость .
Для вашего случая это решается очень легко, вообще не включая заголовочные файлы, и использует только предварительные объявления из классов:
Файл 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
Вам, конечно, нужно включить файлы заголовков в ваши исходные файлы.
Также обратите внимание, что я изменил символы для ваших охранников. Символы с начальным подчеркиванием, за которым следует заглавная буква, зарезервированы во всех областях «реализацией» (компилятором и стандартной библиотекой). Подробнее см. этот старый вопрос и ответы на него .