c++ - 具有不完整类型和 unique_ptr 的树结构

标签 c++ c++11

我有一个关于不完整类型和 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/

相关文章:

c++ - 如何在小型聊天应用程序中为数据库存储的用户事务建模?

c++ - 标准预定义了哪些用户定义文字?

C++ 使用声明、typedef 和数组类型

c++ - 获取用户输入以在私有(private)部分 C++ 中定义变量的值

c++ - QT:尝试将 QString 存储在 std::pair 中时出错

c++ - 如何在不调用 C++ 中的构造函数的情况下分配实例变量?

c++ - 从返回函数中推导出不存在的模板参数

c++ - 为什么在 lambda 中通过引用捕获的值被破坏了?

c++ - 等待条件变量破坏类

c++ - 如何使用 operator new 创建动态二维字符数组?