c++ - 智能指针、前向声明和 C4150

标签 c++ smart-pointers forward-declaration

因此,作为一个大型爱好学习项目的一部分,我实现了一个几乎完整的智能指针实现。它几乎完成了我要求的所有事情,除了一个小细节,如果我无法解决它可能会破坏交易。人为的例子:

//Header1.h

#include <Header2.h>

class A
{
//Methods and such that involve class B in return type / arguments
};

//Header2.h

class A; //Forward declaration of A, needed because A includes Header2.h

class B
{
public:
    SmartPointer<A> Ptr;
};

如您所料,前面的代码给了我 警告 C4150:删除指向不完整类型“type”的指针;没有调用析构函数。我知道为什么会这样;在 Header2.h 中,智能指针代码包括对 A 的前向声明实例的删除。如果我可以包含 Header1.h,没问题。我真的不希望在这一点上进行重构。

我听说 boost 智能指针以某种方式解决了这个问题。引入提升不是这个项目的目的,因为它几乎是一个爱好/学习项目。那么boost是如何处理这个问题的呢?在这种情况下,如何让智能指针表现得像原始指针?我有一些想法,但我认为将问题 float 到 SO 可以将想法列表剔除成有用的子集。

转发,感谢您帮助我解决这个问题。

最佳答案

So how does boost deal with this issue?

Boost 通过在智能指针类模板中使用 checked_delete 而不是 delete 来处理这个问题,因此需要 A 的完整定义。

关于c++ - 智能指针、前向声明和 C4150,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4775633/

相关文章:

c++ - 有没有办法在 C++ 编译时限制数据大小并产生编译错误?

c++ - C++中的动态源代码

c++ - cin.get() 不工作

c++ - Qt C++ QPixmap 只适用于绝对路径,如何在不使用 Qt Resource 的情况下解决?

c++11 - 将智能指针转换为基类

c++ - C++11放弃auto_ptr的原因是什么?

c++ - 使用extern时C++中的重新声明错误

C++前向声明错误

c++ - "using namespace"究竟做了什么?

c++ - 为什么取消引用 unique_ptr 不会修改原始对象