Вот простая версия кода:
//Outer.h
class Inner;
class Outer
{
std::unique_ptr<Inner> m_ptr;
public:
~Outer();
}
//----------------------------------------
//Outer.cpp
#include "Outer.h"
#include "Inner.h" //here is the full definition of class Inner
Outer::~Outer(){};
//----------------------------------------
//main.cpp
#include "Outer.h"
int main()
{
Outer b;
return 0;
}
Когда я компилирую "main.cpp", компилятор возвращается с C2338 (не может удалить неполный тип) и C2027 (использование неопределенного типа 'Inner')
Я прочитал Требуется ли std :: unique_ptr знать полное определение T?
и я знаю, если я включу "Inner.h" в "main.cpp", проблема может быть решена. Но почему?
Для необработанного указателя я могу просто использовать прямое замедление в заголовочном файле (Outer.h
), включить реализацию (Inner.h
) в файл cpp (Outer.cpp
), удалить его вручную в деструкторе, а no необходимо включить реализацию снова там, где я использую.
Но для unique_ptr, аналогично, я использую прямое замедление в заголовочном файле (Outer.h
), включаю реализацию (Inner.h
) в файл cpp (Outer.cpp
), автоматически удаляю ее в деструкторе (с деструктором по умолчанию), Но зачем мне снова включать реализацию внутреннего класса (Inner.h
), когда я его использую?