Широко используется указатель на свой родительский компонент, и я не считаю это плохой практикой. Его можно использовать для самых разных целей, от обработки деревьев виджетов до обработки потерянных или утечек компонентов.
Чтобы обойти проблему с компилятором, вам нужно либо поместить строки включения в защитные элементы заголовка, либо иметь третий файл с предварительными объявлениями для обоих классов (в соответствующем пространстве имен).
Я видел, как последнее было сделано в нескольких больших ОО-библиотеках, и обычно оно включается практически в любой другой файл проекта. Хотя это может привести к некоторому загрязнению пространства имен, у него есть некоторые преимущества (нет необходимости включать полное определение класса или зависимости другого класса только для того, чтобы иметь указатель на него).
Widget.hpp:
#include "Library.hpp"
namespace MyLibrary
{
class Widget
{
private:
Window * parent;
};
}
Window.hpp:
#include "Library.hpp"
namespace MyLibrary
{
class Window
{
private:
std::vector<Widget*> widgets;
};
}
Library.hpp:
namespace MyLibrary
{
class Window;
class Widget;
}