Предположим, у меня есть класс с именем 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
без определения? И почему включение заголовков в исходный файл делает его таким, как если бы он был включен в заголовочный файл?