【问题标题】:Why importing the header file of class 'A' in the source file of class 'B' makes the content of class 'A' defined inside the header file of class 'B'?为什么在“B”类的源文件中导入“A”类的头文件会使“A”类的内容定义在“B”类的头文件中?
【发布时间】: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?为什么在源文件中包含头文件就好像它包含在头文件中一样?

标签: c++ include


【解决方案1】:

你不编译Class.h,你编译的是#includes Class.h的cpp文件。

如果您在main.cpp 中包含Class.h 之前的向量标头,那么在预处理步骤之后,您的main.cpp 文件将具有vector 标头的内容,然后是Class.h 的内容,然后是通过main.cpp 中的其他代码。所以vector 的定义将在Class 中可见。

如果你单独编译 Class.h 头文件,你会得到一个错误。我建议您始终这样做以检查您的头文件是否具有所有必要的头文件并且可以在不依赖副作用的情况下进行编译。

【讨论】:

    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多