gpt4 book ai didi

c++ - 为什么即使从未使用过数据类型,前向声明也不够

转载 作者:太空狗 更新时间:2023-10-29 23:13:00 25 4
gpt4 key购买 nike

<分区>

我知道已经有人问过类似的问题,并且有答案描述在下面描述的情况下前向声明是不够的。但是,这些答案并没有说明为什么还不够。因此,我不认为这是一个重复的问题。

我很难理解为什么编译器必须在以下情况下查看数据类型的定义(前向声明是不够的):

假设我们有一个简单的“main.cpp”,如下所示,它确实除了包含头文件“MyClass.hpp”之外什么都没有

#include <MyClass.hpp>

int main(int argc, char **argv)
{
return 0;
}

现在,让我们考虑“MyClass.hpp”的内容如下:

#include <vector>

class Data1;

class MyClass
{
public:
MyClass(); // default constructor
MyClass(MyClass const & p_other); // copy constructor
MyClass(MyClass && p_other); // move constructor
~MyClass(); // destructor
MyClass & operator=(MyClass const & p_rhs); // copy assignment
MyClass & operator=(MyClass && p_rhs); // move assignment
private:
Data1 * m_a; // forward decl. always OK
Data1 m_b; // forward decl. always not OK
std::vector<Data1> m_c; // forward decl. OK if MyClass is not instantiated
};

MyClass包含几个成员变量:

  • “m_a”是指向“Data1”的指针,
  • “m_b”是“Data1”的实例,
  • “m_c”是一个包含“Data1”类型元素的 vector 。

“Data1”的定义既不包含在“MyClass.hpp”中,也不包含在“main.cpp”中。它只是前向声明。

编译器从来没有成员变量“m_a”的问题,它不需要它的定义来编译“main.cpp”——即使我们实例化“MyClass”也是如此。

因为我们没有实例化“MyClass”,所以编译器对成员变量“m_c”也没有问题。在这种情况下,它也不需要定义“Data1”。

但是,编译器对成员变量“m_b”有问题:

Impl1.hpp:16:24: error: field 'm_b' has incomplete type 'Data1'

我的简单问题是:为什么?

请考虑我们有用户定义的默认构造函数、拷贝构造函数、移动构造函数、用户定义的析构函数和用户定义的复制赋值运算符和移动赋值运算符,即编译器不必为这些构造函数/方法中的任何一个生成代码。那么为了什么目的呢编译器只编译“main.cpp”时需要查看“Data1”的定义?

有人知道答案吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com