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

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

Вот заголовок 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

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

1 ответ

Решение

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

Другие вопросы по тегам