【发布时间】:2020-04-29 01:24:51
【问题描述】:
假设我有一个名为Class的类:
Class.h:
#pragma once
class Class
{
public:
std::vector<int> x();
};
Class.cpp:
#include <vector>
#include "Class.h"
std::vector<int> Class::x()
{
return std::vector<int>();
}
我想这段代码不应该编译,因为std::vector 没有在Class.h 中定义。但代码有效。如果我在包含Class.h 之后包含所需的标头(在本例中只是vector),它将不起作用。但只要在包含Class.h 之前导入所需的标头,一切都可以正常工作。如果我尝试在某个地方单独包含Class.h 并尝试使用它,它也不起作用。因此,例如此代码将不起作用:
#include <iostream>
#include "Class.h"
int main()
{
Class c;
auto x = c.x();
x.push_back(1);
x.push_back(2);
x.push_back(3);
for (auto i : x)
std::cout << i << ' ';
}
但如果我包含所需的标题,它工作正常。所以在这个例子中,如果我包含 vector 标头(也必须在包含 Class.h 之前),它会起作用:
#include <vector>
#include "Class.h"
#include <iostream>
int main()
{
Class c;
auto x = c.x();
x.push_back(1);
x.push_back(2);
x.push_back(3);
for (auto i : x)
std::cout << i << ' ';
}
我认为#include 只是复制粘贴。在Class.h 中,不包含任何标题。怎么可能说这个函数将返回一个 std::vector 而没有被定义呢?为什么在源文件中包含头文件就好像包含在头文件中一样?
【问题讨论】:
-
认为
#include只是将引用的文件复制粘贴到封闭代码中。这会让事情更清楚吗? -
每个源文件和头文件都应该包含它使用的内容。有时可以使用前向声明,这在某些情况下是一个不错的选择。虽然我更喜欢制作包含前向声明的头文件 (
*.hh),然后包含这些文件,因为我发现它更适合大型项目。 -
我认为
#include只是复制粘贴。在Class.h中,不包含任何标题。怎么可能说这个函数会在没有定义的情况下返回一个std::vector?为什么在源文件中包含头文件就好像它包含在头文件中一样?