Pet*_*ugh 4 c++ smart-pointers std c++11
如果我有一个班级'酒吧':
// bar.h
class Bar
{
public:
Bar() { }
};
Run Code Online (Sandbox Code Playgroud)
我转发声明在另一个类'Foo'中使用std :: unique_ptr:
// foo.h
#include <memory>
class Bar;
class Foo
{
public:
Foo();
private:
std::unique_ptr<Bar> bar_;
};
Run Code Online (Sandbox Code Playgroud)
我将其定义包含在Foo的实现文件中:
// foo.cpp
#include "foo.h"
#include "bar.h"
Foo::Foo()
: bar_(new Bar)
{ }
Run Code Online (Sandbox Code Playgroud)
我得到编译时错误"'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.
但模板方法仅在使用时实例化.
独特的ptr被Fooin 所摧毁Foo::~Foo.如果~Foo生活在可以看到定义的地方~Bar,一切都很好.
如果你让它由编译器生成,那么它"生活"在声明中Foo,它无法看到~Bar.
如果你转发声明它,然后在文件中做一个Foo::~Foo() = default或之后,它可以看到被称为` 的点,一切都很好.Foo::~Foo() {}.cpp#include <bar.h>~Bar~std::unique_ptr<Bar>
这在实践中Bar很重要,因为销毁方式因if是否~Bar为虚拟而有所不同,如果Bar有父母,如果~Bar是私有/受保护则可能是非法的.
| 归档时间: |
|
| 查看次数: |
389 次 |
| 最近记录: |