Раздельное определение внутреннего класса и окружающего класса

Как правильно разделить определение внутреннего класса и включающего класса на разные заголовочные файлы, если включающий класс имеет переменную-член, которая является экземпляром внутреннего класса?

Вот заголовок Outer (включающий класс):

//outer.h
#ifndef OUTER_H_INCLUDED
#define OUTER_H_INCLUDED

#include "inner.h"
class Outer
{
class Inner;

public:
/* public member functions */

private:
Inner inner_instance;
};

#endif

И заголовок Inner:

//inner.h
#ifndef INNER_H_INCLUDED
#define INNER_H_INCLUDED

#include "outer.h"
class Outer::Inner
{
/* definition */
};

#endif

Это не скомпилируется. Проблема в том, что оба класса должны видеть определения друг друга. Можно ли разорвать круговую зависимость и при этом оставить определения разделенными?

2

Решение

Нет. Лучшее, что вы можете сделать — это сохранить указатель (или, возможно, ссылку) на внутренний класс, что позволяет Inner быть неполным. Это обычно известно как pImpl идиома.

3

Другие решения

Других решений пока нет …