Отдельное определение внутреннего класса и внешнего класса

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

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

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


person Gergely Tomcsányi    schedule 23.09.2017    source источник
comment
Некоторые люди используют встроенный файл inner.inl и включают файл непосредственно в определение класса Outer.   -  person Passer By    schedule 23.09.2017


Ответы (1)


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

person Alan Stokes    schedule 23.09.2017
comment
Я бы использовал std::unique_ptr‹Inner› для реализации идиомы pImpl. - person Artemy Vysotsky; 23.09.2017
comment
Да, это был бы хороший выбор. Вам нужен интеллектуальный указатель, который допускает неполный тип. Вы должны быть осторожны с конструктором и деструктором Outer — они не могут быть встроенными. - person Alan Stokes; 24.09.2017