如果我有一个“酒吧”课:
// bar.h
class Bar
{
public:
Bar() { }
};
我转发声明要与另一个类“ Foo”中的std :: unique_ptr一起使用:
// foo.h
#include <memory>
class Bar;
class Foo
{
public:
Foo();
private:
std::unique_ptr<Bar> bar_;
};
以及我在Foo的实现文件中包含的定义:
// foo.cpp
#include "foo.h"
#include "bar.h"
Foo::Foo()
: bar_(new Bar)
{ }
我收到编译时错误“'sizeof'的无效应用到不完整的'Bar'类型”。
我从这里到这里都知道要解决此问题,我可以在foo.h中声明Foo的析构函数,并将其空定义移至foo.cpp。我不明白的是,为什么要解决它。我读到了std :: unique_ptr有时需要知道其类型的完整定义。如果我必须从bar.h中包含Bar,以使unique_ptr看到其定义,这对我来说很有意义。但是Foo的析构函数与Bar的可见性有什么关系,为什么在foo.h中声明〜Foo()并在foo.cpp中定义它会导致错误静音?
的析构函数unique_ptr<Bar>
调用Bar::~Bar
时,它delete
的的Bar
它拥有。所以~unique_ptr<Bar>
需要看Bar::~Bar
。
但是模板方法仅在使用时实例化。
Foo
in破坏了唯一的ptr Foo::~Foo
。如果~Foo
住在可以看到的定义的地方~Bar
,那么一切都很好。
如果您让它由编译器生成,则它将“存在”于Foo
它看不到的声明中~Bar
。
如果向前声明它,则在之后的文件中执行Foo::~Foo() = default
或,它可以在称为`的点看到,并且一切都很好。Foo::~Foo() {}
.cpp
#include <bar.h>
~Bar
~std::unique_ptr<Bar>
这在实践中Bar
很重要,因为如何销毁取决于是否~Bar
是虚拟的,是否Bar
有父母以及是否~Bar
是私人/受保护的,因此呼叫是非法的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句