Используйте unique_ptr <T>с прямыми отведениями к C2027 и C2338 - PullRequest
2 голосов
/ 07 мая 2019

Вот простая версия кода:

//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), когда я его использую?

1 Ответ

2 голосов
/ 07 мая 2019

Вам нужно определить конструктор в файле .cpp, а не просто деструктор.

Если конструктор Outer завершится неудачно, ему нужно будет уничтожить m_ptr, то, что требует знания определенияclass Inner.

...