我有一个关于不完整类型和 unique_ptr 的快速问题。 我试图拥有一个简单的树状结构,它已在此处进行了简化,但我遇到了一些关于不完整类型的编译器错误,我所知道的是我必须定义生成的 dtor。虽然这并没有解决问题,但至少在我正在测试的 msvc 中是这样。
相反,我必须做的是,对于每个需要销毁不完整类型的类,我只需要在 .cpp 文件中包含相关的头文件。明确定义 dtor 没有帮助,这让我感到惊讶。
Level1.h
#include "Level2Vector.h"
class Level1
{
public:
Level1() : lvl2_vec(this) {}
private:
Level2Vector lvl2_vec;
};
Level1.cpp
#include "Level2.h" // this was needed to not get the incomplete type
#include "Level3.h" // this was needed to not get the incomplete type
Level2.h
#include "Level3Vector.h"
class Level1;
class Level2
{
public:
Level2(Level1* const lvl1) : parent_(lvl1), lvl3_vec(this){}
private:
Level1* parent_;
Level3Vector lvl3_vec;
};
Level2.cpp
#include "Level2.h"
#include "Level3.h" // this was needed to not get the incomplete type
Level3.h
class Level2;
class Level3
{
public:
Level3(Level2* const lvl2) : parent_(lvl2) {}
private:
Level2* parent_;
};
Level2Vector.h
class Level1;
class Level2;
class Level2Vector : public std::vector<std::unique_ptr<Level2>>
{
public:
Level2Vector(Level1* lvl1) : parent_(lvl1) {}
private:
Level1* parent_;
};
Level3Vector.h
class Level2;
class Level3;
class Level3Vector : public std::vector<std::unique_ptr<Level3>>
{
public:
Level3Vector(Level2* lvl2) : parent_(lvl2) {}
//~Level3Vector();
private:
Level2* parent_;
};
我错过了什么吗? 是否每个可能使用 Level2Vector 的类都需要包含 Level2.h header ?
最佳答案
析构函数的类型应该是完整的,但是析构函数是内联自动生成的,这意味着类被销毁的每个地方都应该有std::unique_ptr
拥有的类定义。 .
避免此问题的更简单方法是为每个具有 std::unique_ptr
的类声明析构函数成员。所以:
class Level3Vector
{
public:
explicit Level3Vector(Level2* lvl2) : parent_(lvl2) {}
~Level3Vector();
// And so rule of 5
Level3Vector(const Level3Vector&) = delete;
Level3Vector& operator =(const Level3Vector&) = delete;
Level3Vector(Level3Vector&&) = default;
Level3Vector& operator =(Level3Vector&&) = default;
private:
std::vector<std::unique_ptr<Level3>> lvl3s;
Level2* parent; // or std::observer_ptr<Level2> parent;
};
在 cpp 中:
#include <Level3.h>
Level3Vector::~Level3Vector() = default;
然后销毁Level3Vector
在其他类中不需要包含 <Level3.h>
.
关于c++ - 具有不完整类型和 unique_ptr 的树结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40031007/