具有不完整类型和unique_ptr的树结构
Tree structure with incomplete types and unique_ptr
我有一个关于不完整类型和unique_ptr的快速问题。我试着有一个简单的树形结构在这里已经被简化了我得到了一些关于不完整类型的编译器错误我知道的是我必须定义dr,它使。虽然这并没有解决问题,但至少在我正在测试的msvc中。
我所要做的是,对于每个需要销毁不完整类型的类,我必须在.cpp文件中包含相关的头文件。明确定义医生没有帮助,这让我很惊讶。
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头文件?
析构函数的类型应该是完整的,但是析构函数是内联自动生成的,所以这意味着类被销毁的每个地方都应该有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;
};
#include <Level3.h>
Level3Vector::~Level3Vector() = default;
则其它类Level3Vector
的破坏不需要<Level3.h>
的加入。
一般来说,您可以使用前向声明类型(例如在头文件中使用该类型定义指针);但是类型的定义必须在需要类型定义之前可用。例如,在Level1.h中,你定义了一个Level2Vector类型的对象(不是指向Level2Vector的指针!);所以Level1.h必须包含Level2Vector.h。
考虑到这一点,让我们检查你的问题"是否每个可能使用Level2Vector的类都需要包含Level2.h头文件?"答案是否定的。Level2.h提供了类Level2的定义。所以正确的看待方法是:如果文件需要Level2的定义,那么文件(无论是否使用Level2 vector)需要包含Level2.h。相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- 如何在C++中序列化结构数据
- 对于没有功能的结构,"new (ptr) mystruct;"做什么?
- C++ 如何从指向结构的指针将 PTR 返回到 int
- LNK 2001 未解析的外部在 NPPluginFuncs 结构 ptr 作为静态类成员
- 同时在 epoll 数据结构中使用 void *ptr 和 int fd
- 在malloc()之后初始化结构中对ptr的引用
- PTR到结构体和PTR到结构体的向量的模板方法专门化