В C++, когда вы # включаете что-то, включенный файл более или менее «вставлен» вместо этой директивы.
Существует концепция под номером единица перевода, которая указывает блок кода, который компилируется и может в будущем ссылаться на другие блоки (при времени соединения).
Вы хотите написать блок перевода и предоставить другим единицам перевода информацию о том, как получить доступ к этим данным. Такова цель файла .
.h файл (.h по соглашению, вы могли бы назвать это как угодно) представляет собой набор деклараций, как
Файл s1class.h
class s1
{
private:
int gxd;
public:
int gx(int x,int y)
{
gxd = x;
return x;
}
};
и
App1. каст:
#include"s1class.h"
//... use s1 class
app2.cpp:
#include"s1class.h"
//... use s1 class
Просто заметить одну вещь: вы должны никогда нарушают One Definition Rule, вы можете объявить столько раз, сколько вы хотите что-то (до тех пор, пока они последовательные заявления), но вы не можете определить более, чем один раз символ (например, функция). (маленькое примечание: #pragma однажды директивы и подобные вещи могут помочь вам избежать повторного объявления символов более одного раза и сделать вашу жизнь проще, если включить заголовок несколько раз в нескольких местах).
Таким образом, в приведенном выше коде функция «gx» определена в файле заголовка. Эта функция должна существовать только один раз на единицу перевода, где она используется.
В этом конкретном случае он используется для создания единиц перевода для app1.cpp и app2.cpp. Это должно нарушить ОДР, не так ли? Это не будет, так как функция-член для класса неявно встроена в, что означает, что она «сшита» в тело вызывающего абонента, тем самым интегрируя часть идентификатора вызывающего.
Альтернативой является только объявить вещи в файле заголовка и реализовать их в связанном файле CPP:
s1class.ч
#pragma once
class s1
{
private:
int gxd;
public:
int gx(int x,int y);
};
s1class.cpp
#include "s1class.h"
int s1::gx(int x,int y)
{
gxd = x;
return x;
}
и продолжить, как указано выше: от всего, включая файл заголовка для того, чтобы использовать его во время компоновки (когда символы разрешены).
Почему бы не использовать заголовки? – JBL
Это хорошая практика, но это не решает мою проблему. – JoeFrom
никогда не включают файлы .cpp с командой 'include <>' – deW1