c++ 언어에서 .h 헤더 파일에 구현부가 들어올 수 있나요?
안녕하세요. ㅎ
근래에 c++을 배우고 있는 초보 입니다. ㅎ
다름이 아니고 class에 대한 코드를 책의 내용대로 따라서 입력해 보고 있는데,
예제에는 아래의 내용이 .h 헤더 파일에 입력되어 있습니다.
.h 헤더 파일에서 멤버 함수의 선언만 하고
.cpp 파일에서 정의부를 입력하는게 맞는것 아닌가 생각이 되는데요.
.h 파일에 선언부와 정의부를 같이 입력 하는 것인가요?
아래는 Construct.h 파일의 내용 입니다.
#include
class Circle {
public:
int Radius;
public:
Circle();
void Set_Radius(int a);
double Circle_Area();
};
Circle::Circle() {
Radius = 2;
}
void Circle::Set_Radius(int a) {
Radius = a;
}
double Circle::Circle_Area() {
return Radius * Radius * 3.1416;
}
class Square {
private:
int garo, sero;
public:
Square() {
garo = 2; sero = 10;
}
Square(int a, int b);
int Square_Area();
void Square_Out();
};
Square::Square(int a, int b) {
garo = a;
sero = b;
}
int Square :: Square_Area() {
return garo * sero;
}
void Square::Square_Out() {
cout << "사각형의 넓이 : " << Square_Area() << endl;
}
그렇습니다.
헤더 파일에 선언, 소스 파일에 정의를 넣는 것은 사실 그렇게 해야 하는 것은 아니고 그렇게 하는 것이 효율적이어서 그렇습니다.
사실 cpp에서 include라는 명령이 하는 일이 그냥 코드를 그 위치에 갖다박는 거라서요.
예를 들어서 이런 코드라도 정상적으로 동작합니다.
header1.h
header2.h
main.cpp
저는 이렇게 생각했습니다.
고맙습니다.
HDNua 님의 글을 보고서 어느 정도 이해가 되었습니다.
고맙습니다. ㅎㅎ
hello
이 해더가 두 개 이상의 다른 목적 파일로 컴파일되지
이 해더가 두 개 이상의 다른 목적 파일로 컴파일되지 않는 한 문제되지 않습니다. 두 번 이상 컴파일되면 링크 단계에서 빌드에 실패합니다.
> 헤더에는 원래 정의가 오면 안되는걸로
> 헤더에는 원래 정의가 오면 안되는걸로 알고있습니다.
뭐 C에서는 맞는 말이지만, C++에서는 그렇지 않습니다.
템플릿들은 반드시 헤더에 정의해야만 합니다.
그래서 C++라이브러리 중에는 header only implementation도 많습니다.
오직 헤더 파일로만 이루어진 라이브러리이지요.
(.a 나 .so, .dll 파일 등이 없습니다.)
그런 경우에는 확장자를 .h 대신에 .hpp를 쓰는 것이 관례입니다.
템플릿들은 반드시 헤더에 정의해야 한다고 정해진 것은
템플릿들은 반드시 헤더에 정의해야 한다고 정해져 있는 것은 아니고,
호출하는 측에서 template implementation 을 알아야 instantiation이 가능하기 때문에 편의상 그렇게 하는 것 뿐이죠.
별도로 만들려면 만들수는 있어요.
어떻게 만들지요? 사용할 모든 instance들을
어떻게 만들지요?
사용할 모든 instance들을 미리 정의해서 컴파일해놓지 않는 한 불가능할텐데요.
그리고 사용할 모든 instance들을 미리 아는 것은 특별한 경우를 제외하고는 없습니다.
간단하지는 않지만,소위 말하는 explicit
간단하지는 않지만,
소위 말하는 explicit instantiation directive 나 implicit 또는 automatic instantiation을 이용하는 등 여러 방법이 있습니다.
Vandevoorde 와 Josuttis 의 책에 자세히 나와 있습니다.
댓글 달기