본문 바로가기

고급C,C++

클래스 템플릿

템플릿들은 함수가 아니기 때문에 개별적으로 컴파일할 수 없다. 템플릿들은 특별한 구체화 요구들과 함께 결합하여 사용해야 한다. 가장 간단한 방법은, 모든 템플릿 관련 정보를 헤더 파일에 집어 놓고, 그 템플릿들을 사용하는 파일에 그 헤더 파일을 포함시키는 것이다.




// stacktp.h -- a stack template
#ifndef STACKTP_H_
#define STACKTP_H_
template <class Type>
class Stack
{
private:
enum {MAX = 10}; // constant specific to class
Type items[MAX]; // holds stack items
int top; // index for top stack item
public:
Stack();
bool isempty();
bool isfull();
bool push(const Type & item); // add item to stack
bool pop(Type & item); // pop top into item
};
template <class Type>
Stack<Type>::Stack()
{
top = 0;
}
template <class Type>
bool Stack<Type>::isempty()
{
return top == 0;
}

template <class Type>
bool Stack<Type>::isfull()
{
return top == MAX;
}
template <class Type>
bool Stack<Type>::push(const Type & item)
{
if (top < MAX)
{
items[top++] = item;
return true;
}
else
return false;
}
template <class Type>
bool Stack<Type>::pop(Type & item)
{
if (top > 0)
{
item = items[--top];
return true;
}
else
return false;
}
#endif





  • 템플릿 클래스 사용 - 템플릿을 프로그램에 단순히 포함시키는 것만으로는 템플릿 클래스가 생성되지 않는다. 구체화를 요청해야 한다. 구체화를 요청하려면, 템플릿 클래스형의 객체를 선언하되, 포괄적인 데이터형 이름을 구체적인 데이터형으로 대체해야 한다.
    Stack<int> kernels; //int 값들의 스택을 생성한다.
    Stack<string> colonels; //string 객체들의 스택을 생성한다.

    사용하려는 데이터형을 명시적으로 제공해야 한다. 함수 전달인자의 데이터형을 사용하여, 컴파일러가 어떤 종류의 함수를 생성할 것인지 결정하는 일반적인 함수 템플릿과 이 점에서 다르다.