为什么在类'B'的源文件中导入类'A'的头文件,使得类'A'的内容定义在类'B'的头文件里面?

问题描述 投票:0回答:1

假设我有一个名为 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. 但代码可以工作。如果我包含了所需的头文件(在本例中只有 vector)后,包括 Class.h. 但是,只要在加入 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 而没有定义它?而为什么在源文件中包含头文件,就会让它像包含在头文件中一样?

c++ include
1个回答
1
投票

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

如果你在 Class.hmain.cpp然后,经过预处理步骤,你的 main.cpp 文件的内容将有 vector 头,然后是 Class.h,后面是其他代码 main.cpp. 所以 vector 将在 Class.

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

© www.soinside.com 2019 - 2024. All rights reserved.