为什么即使从未使用了数据类型,为什么还不够
Why is a forward declaration not enough even if the data type is never used
我知道已经提出了类似的问题,并且有答案描述在下面描述下面声明还不够的情况下。但是,这些答案并不能说明为什么还不够。因此,我认为这不是一个重复的问题。
我很难理解为什么编译器必须在以下情况下看到数据类型的定义(foward声明不够):
让我们考虑一下我们有一个简单的" 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"元素的向量。
" data1"的定义尚未包含在" myclass.hpp"中,也不包含在" main.cpp"中。它只是向前声明。
编译器从来没有成员变量" m_a"的问题,它不需要其定义来编译" main.cpp" - 即使我们会诱使" myclass"。
由于我们没有实例化" myclass",因此编译器也没有成员变量" m_c"的问题。在这种情况下,它也不需要" data1"的定义。
但是,编译器与成员变量" m_b"有问题:
impl1.hpp:16:24:错误:字段'm_b'具有不完整的类型'data1'
我的简单问题是:为什么?
请考虑我们有用户定义的默认构造函数,复制构造函数,移动构造函数,用户定义的破坏者和用户定义的副本评估操作员和移动分配运营商,即编译器不必为任何这些构造函数/方法生成代码。所以出于什么目的仅编译" main.cpp"?
时,编译器需要查看" data1"的定义。有人知道答案吗?
MyClass
的大小取决于 Data1
的大小,只有从 Data1
的 defution 中才能知道。这就是为什么您不能将类型不完整作为字段中的字段。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 为什么我们需要构建一个提升库,仅仅包含头文件还不够吗,因为提升是模板
- 为什么 SDL2 为音频样本提供的缓冲区不够大
- 为什么即使从未使用了数据类型,为什么还不够
- 为什么在使用对象作为多映射中的键时,驱动器被称为远远不够
- 为什么在写入不够大的内存时 strcpy "work"?
- 对于级联成员函数调用,为什么需要返回引用?为什么只有这个指针还不够?
- 为什么仅仅边界描述符的安全设置是不够的
- 为什么OnDraw还不够(在MFC中,涂鸦教程)
- 为什么需要模板/泛型?继承还不够吗?