为什么我得到了未知的尺寸'我使用' =默认'时出错对于析构函数?

时间:2016-12-20 07:01:12

标签: c++11

Inner.hpp

#pragma once

#include <vector>

class Outter
{
public:
    Outter();
    ~Outter() = default;

private:
    class Inner;
    std::vector<Inner> list;
};

Inner.cpp

#include "Inner.hpp"
#include <iostream>

class Outter::Inner
{
public:
    Inner() : x(0), y(0), z(0) {}
    ~Inner() {}
private:
    int x, y, z;
};

Outter::Outter()
{
    std::cout << "Constructor\n";
}

//Outter::~Outter()
//{
//    std::cout << "Destructor\n";
//}

InnerMain.cpp

#include "Inner.hpp"

int main()
{
    Outter test;
}

当我编译上面的代码时,我得到了一个未知的大小&#39;类Outter :: Inner。

的错误

但如果我改变了默认值&#39; Outter类的析构函数到Inner.cpp中的实现(在上面注释),然后清除错误。

为什么当我使用&#39; =默认&#39;析构?

请告诉我。

感谢。

因此,在这种情况下,&#39; =默认&#39;并不重要。 应该将实现放在.cpp文件中,以使编译器知道类Outter :: Inner的大小。

1 个答案:

答案 0 :(得分:3)

前进声明在这里还不够。 std::vector需要确切知道编译时内部类的大小是多少。实际上,std::vector析构函数需要知道内部类的实际大小。

你有一些解决方案,比如使用指向Inner类的指针(如果你想让你的析构函数保持在hpp中):

std::vector<Inner*> list;

或者,将您的析构函数移动到cpp类,就像您在注释代码中所做的那样。顺便说一句,请注意您可以在cpp文件中将析构函数设置为default

Outter::~Outter()=default;
  

为什么在使用'= default'析构函数时会发生这种情况?

由于std::vector的析构函数需要知道大小。您在头文件中定义了包含std::vector的类的析构函数,其中没有关于inner实际大小的信息。但是,当您将析构函数的定义放在cpp文件中时,编译器现在知道inner的实际大小是什么,而std::vector析构函数不会抱怨。