Откуда компилятор знает о существование объекта?

Откуда компилятор знает о существование объекта?

Header.h:

void sd() {
    SD sd;
}

Header1.h:

class SD {};

Source.cpp:

#include "Header.h"
#include "Header1.h"

Так как препроцессор вставляет вместо директивы include содержимое файла. Получается что препроцессор передаёт компилятору файл в следующем виде:

void sd() {
    SD sd;
}
class SD {}

Как я могу тогда использовать объект SD если он ещё не опеределён?


Ответы (1 шт):

Автор решения: Andrei

string Это стандартная библиотека она находится по стандартному пути потому препроцессор знает этот путь и вместо #include <string> вставляет в файл код класса. Получается вверху страницы перед int main(int argc, char* argv[]){} вместо #include <string> появляется код класса string препроцессор просто копирует его туда. Если класс не стандартный, написанный Вами тогда Вы его вставляете таким образом #include "Путь/к/myclass.h". Препроцессор идет по тому пути который Вы указали и копирует оттуда необходимый класс.

Вы описали неправильно взаимодействие вставляемых файлов директивой #include потому Ваш код не будет работать. Чтобы он заработал нужно правильно определить куда необходимо вставлять заголовочные файлы. То есть какой файл от какого зависит. Код должен выглядеть как-то так:

header.h

#include "header1.h"


SD sd()
{
    SD sd;
    return sd;
}

header1.h

#include <iostream>


class SD
{
    public:
        SD()
        {
            std::cout << 
            "A'm class " << 
            typeid(this).name() << 
            std::endl;
        }
};

source.cpp

#include "header.h"


int main(int argc, char **argv)
{
    sd();
    return 0;
}
→ Ссылка