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的大小。
答案 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
析构函数不会抱怨。