기본 개념
1. header 파일 예시
예를들면, test.h 라는 헤더 파일이 있고 안에 namespace { class { function } }이 있다하자. 여기서 어떻게 동작하는지와 같은 자세한 내용은 작성하지 않는다. 즉, 틀만 작성한다.
// test.h
namespace N
{
class test
{
public:
void function();
private:
int value = 0;
};
}
2. .cpp 파일 예시
이제 test.cpp 파일을 만들고 #include "test.h"로 컴파일러에게 test.h에 정의된 내용을 알려준다. header 파일에 틀을 작성했다면, .cpp 파일에는 틀이 어떻게 동작하는지 작성해주면 된다. header 파일에서 function의 기능을 작성하지 않았기에 .cpp 파일에서는 class::function() { 기능 }을 정의한다.
// test.cpp
#include "test.h" // 작성한 헤더 파일
using namespace N;
void test::function()
{
// 기능 작성
}
정리하면 header 파일에 틀을 작성하고, .cpp 파일에는 각 틀에 대한 기능을 정의한다.
추가로 test.h에 있는 namespace 이름을 .cpp 파일에서 using namespace ???;로 알려주지 않으면,
namespace이름::class이름::function이름()처럼 작성해야 한다. 이는 using namespace std;를 통해 std::cout가 아닌 cout로 사용하는 것을 생각하면 된다.
void N::test::function()
{
// 기능 작성
}
3. main 파일 예시
이제 main으로 사용하는 파일에서 header 파일을 #include를 통해 불러오고 사용하면 된다.
#include <iostream> // 컴파일러가 제공하는 헤더 파일
#include "test.h" // 작성한 헤더 파일
using namespace std;
int main()
{
test my_test;
my_test.function();
}
4. 참고 자료
https://docs.microsoft.com/en-us/cpp/cpp/header-files-cpp?view=msvc-170
Header files (C++)
Learn more about: Header files (C++)
docs.microsoft.com
#pragma once
클래스 파일( h, cpp )을 생성했을 때, header파일에 #pragme once가 자동 생성되는 것을 볼 수 있다.
// Test.h
#pragma once
이는 해당 header 파일이 main에서 여러번 호출되면 하나만 적용하고 나머지는 무시하게 해준다.
#include "Test.h"
#include "Test.h" // 무시
#include "Test.h" // 무시
int main()
{
}
해당 기능이 중요한 이유는 header 파일에 선언문만 사용하는게 아니라 구현까지 했을 때 문제가 생기기 때문이다.
// Test2.h
#pragma once
struct Test
{
int number;
};
void Test();
// main.cpp
#include "Test2.h"
#include "Test2.h"
int main()
{
}
Test2.h 파일처럼 선언과 구현을 모두 했을 경우 #pragme once가 없으면 같은 구조체가 두 번 생성된다.
// main.cpp
// #include "Test2.h"
struct Test
{
int number;
};
void Test();
// #include "Test2.h"
struct Test
{
int number;
};
void Test();
int main()
{
}
이렇게 같은 구조체가 두 번 호출되면 충돌이 발생한다.
Template<typename T>
헤더 파일에서 class를 정의할 때, template<T>를 사용하는 경우가 있다.
template<T> class는 cpp 파일에 분리할 수 없다.
따라서 해당 class는 헤더 파일에 기능까지 구현해야 한다.
'프로그래머 > CPP_메모' 카테고리의 다른 글
c++ 연산자 오버로딩 정리 (0) | 2022.04.03 |
---|---|
c++ 배열 정리 (0) | 2022.03.21 |
c++ 참조 정리 (0) | 2022.03.20 |
c++ 포인터 정리 (0) | 2022.03.20 |
c++의 다양한 input 방법과 속도 비교 (0) | 2022.03.17 |