[13-2] 클래스 템플릿

dd_ddong·2022년 8월 25일
0

c++

목록 보기
38/38

클래스 템플릿과 템플릿 클래스

클래스의 템플릿화

  1. 일반 클래스
class Point
{
private:
	int xpos, ypos;
public:
	Point(int x = 0, int y = 0) : xpos(x), ypos(y)
    { }
    void ShowPosition() const 
    {
    	cout << "[" << xpos << " , " << ypos << "]" << endl;
    }
    
}
  1. 템플릿화
template <typename T>
class Point
{
private:
	T xpos, ypos;
public:
	Point(T x = 0, T y = 0) : xpos(x), ypos(y)
    { }
    void ShowPosition() const 
    {
    	cout << "[" << xpos << " , " << ypos << "]" << endl;
    }
    
}

템플릿 클래스의 생성은 컴파일러에 의해 객체 생성시 일어난다.
템플릿 클래스의 객체 생성 시 자료형의 생략은 불가능하다.

int main()
{
	Point<int> pos1(1, 4); //Point<int> 클래스 생성 후 객체 생성
    Point<double> pos2(2.1, 4.6); //Point<double> 클래스 생성 후 객체 생성
}

선언과 정의의 분리

클래스의 선언부 -> .h에 작성
클래스의 정의부 -> .cpp에 작성

위와 같이 분리해서 작성하는 경우가 많다.

위와 같은 template이 헤더파일에 선언되어 있다고 하자
이 클래스의 정의를 .cpp에 작성할 때

  1. SimpleTemplate::SimpleFunc( .... ) -> X
  • SimpleClass는 클래스가 아닌 템플릿 이기 때문에 잘못된 정의이다.
  1. SimpleTemplate<T>::SimpleFunc( .... ) -> O
  • SimpleTemplate<T> 라는 클래스의 멤버함수 정의

함수 정의마다 template <typename T>로 T가 무엇인지 알려줘야 한다.

파일 분리 시 고려할 점

c++의 컴파일 과정

  • 헤더파일은 컴파일 하지 않는다.
    cpp파일 내에 include한 헤더파일 내용이 복사만 된다.
  • cpp 파일만 컴파일 한다.
    각각의 cpp 파일은 독립적으로 컴파일 된다.
    컴파일 된 같은 프로젝트의 파일은 링킹을 통해 하나의 실행파일이 된다.

클래스 템플릿인 경우

SimpleTemplate.h

SimpleTemplate.cpp 와 main.cpp에 복사된다.

SimpleTemplate.cpp

템플릿 타입인 T만 정의되어있어 메모리 할당을 얼마나 할지 알수 없다.
따라서 함수 몸체부분의 메모리 할당이 정의되지 않고 넘아가게 된다.

main.cpp

객체생성으로 템플릿 클래스가 생성된다.
하지만 멤버함수를 호출할 경우 SimpleTemplate.cpp에서 메모리 할당이 정의되지 않았으므로 링킹에러가 난다.

해결법

  1. main.cpp에서 #include "SimpleClass.cpp"도 추가한다.
    파일이 복잡해질 가능성이 높다.
  2. 템플릿의 경우 파일 분리를 하지말고 헤더파일에 정의도 추가한다.
    탬플릿 클래스 생성시 링킹없이 구체화 할 수 있다.

0개의 댓글