c++ 언어에서 .h 헤더 파일에 구현부가 들어올 수 있나요?

nice7285의 이미지

안녕하세요. ㅎ
근래에 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;
}

HDNua의 이미지

헤더 파일에 선언, 소스 파일에 정의를 넣는 것은 사실 그렇게 해야 하는 것은 아니고 그렇게 하는 것이 효율적이어서 그렇습니다.
사실 cpp에서 include라는 명령이 하는 일이 그냥 코드를 그 위치에 갖다박는 거라서요.
예를 들어서 이런 코드라도 정상적으로 동작합니다.
header1.h

int main()
{

header2.h

 return 0;
}

main.cpp

#include "header1.h"
#include "header2.h"

저는 이렇게 생각했습니다.

nice7285의 이미지

HDNua 님의 글을 보고서 어느 정도 이해가 되었습니다.
고맙습니다. ㅎㅎ

hello

klyx의 이미지

이 해더가 두 개 이상의 다른 목적 파일로 컴파일되지 않는 한 문제되지 않습니다. 두 번 이상 컴파일되면 링크 단계에서 빌드에 실패합니다.

익명 사용자의 이미지

> 헤더에는 원래 정의가 오면 안되는걸로 알고있습니다.

뭐 C에서는 맞는 말이지만, C++에서는 그렇지 않습니다.
템플릿들은 반드시 헤더에 정의해야만 합니다.
그래서 C++라이브러리 중에는 header only implementation도 많습니다.
오직 헤더 파일로만 이루어진 라이브러리이지요.
(.a 나 .so, .dll 파일 등이 없습니다.)
그런 경우에는 확장자를 .h 대신에 .hpp를 쓰는 것이 관례입니다.

ifree의 이미지

템플릿들은 반드시 헤더에 정의해야 한다고 정해져 있는 것은 아니고,
호출하는 측에서 template implementation 을 알아야 instantiation이 가능하기 때문에 편의상 그렇게 하는 것 뿐이죠.
별도로 만들려면 만들수는 있어요.

익명 사용자의 이미지

어떻게 만들지요?
사용할 모든 instance들을 미리 정의해서 컴파일해놓지 않는 한 불가능할텐데요.
그리고 사용할 모든 instance들을 미리 아는 것은 특별한 경우를 제외하고는 없습니다.

ifree의 이미지

간단하지는 않지만,
소위 말하는 explicit instantiation directive 나 implicit 또는 automatic instantiation을 이용하는 등 여러 방법이 있습니다.
Vandevoorde 와 Josuttis 의 책에 자세히 나와 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.