Как правильно разделить определение внутреннего класса и включающего класса на разные заголовочные файлы, если включающий класс имеет переменную-член, которая является экземпляром внутреннего класса?
Вот заголовок 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
Это не скомпилируется. Проблема в том, что оба класса должны видеть определения друг друга. Можно ли разорвать круговую зависимость и при этом оставить определения разделенными?
Нет. Лучшее, что вы можете сделать — это сохранить указатель (или, возможно, ссылку) на внутренний класс, что позволяет Inner
быть неполным. Это обычно известно как pImpl
идиома.
Других решений пока нет …