gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:28:32 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com