Unique_ptr和前向声明

时间:2014-12-06 21:31:34

标签: c++ c++11

说我有两个班级:

" foo.h中"

#pragma once    
class Foo
{
public:
    Foo()
    {

    };

    ~Foo()
    {

    };
};

" A.H"

#pragma once
#include <memory>

class Foo;

class A
{
public:
    A(){};
    ~A(){};

    std::unique_ptr<Foo> foo;
};

A拥有unique_ptr Foo。我不想将Foo包含在&#34; A.h&#34;中,所以我转发声明它。只需在&#34; A.h&#34;中向前声明类Foo,就会出现编译时错误:

error C2027: use of undefined type 'Foo'
error C2338: can't delete an incomplete type  

所以我正在关注如何避免此错误的this文章,并将A的析构函数移入其自己的.cpp文件中,其中我还包含Foo:

&#34; A.cpp&#34;

#include "A.h"

#include "Foo.h"

A::A()
{

}

A::~A()
{

}

在A.cpp&#34;中实现A的析构函数之后,我能够编译程序,因为类Foo在&#34; A.cpp&#34;中已知。这似乎是合乎逻辑的,因为unique_ptr需要完整的类型来调用它的析构函数。但令我惊讶的是,在评论出A的构造函数(在&#34; A.h&#34;以及&#34; A.cpp&#34;)之后,我得到了同样的错误。这怎么可能?为什么编译器抱怨在A没有构造函数时无法调用Foo的析构函数?

编辑: 我上传了4个文件,因此您可以测试该程序。 我正在使用Visual Studio 2013的MSVC ++。

http://www.filedropper.com/test_61

2 个答案:

答案 0 :(得分:18)

构造函数需要以与析构函数相同的方式访问删除器:异常安全性要求构造函数能够在构造函数的主体抛出的情况下回滚所有成员的初始化: / p>

  

[C++14: 12.6.2/10]:在非委托构造函数中,可能会调用每个可能构造的类类型子对象的析构函数(12.4)。 [注意:此规定确保在抛出异常时可以为完全构造的子对象调用析构函数(15.2)。 -end note]

相关:

答案 1 :(得分:-1)

A&#39; A&#39;是不可能的。没有构造函数。

如果您对您编写的构造函数进行注释,编译器将为您创建一个默认构造函数,并且它不一定与您定义的构造函数位于同一位置。导致问题。