#클래스에서의 템플릿
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
class CLS
{
T m_a;
public:
CLS(T _a) { m_a = _a; }
};
void main()
{
CLS<int> cls(10);
}
위 코드와 같이 클래스에서 템플릿을 이용해 자료형을 사용자 입맛에 맞게 설정하여 객체를 생성할 수 있다.
위처럼 템플릿클래스는 컴파일러가 코드라인을 컴파일 할 때 클래스의 원형을 만들기 때문에
헤더파일만 include 할 경우 정의부 정보를 알 수가 없다.
정의부를 알 수 없기 때문에 클래스 원형을 만들 수가 없다.
또한 템플릿은 파일 분할시에 매 함수마다 template <typename T>를 명시해야하는 귀찮음이 있다.
(명시를 한다 해도 클래스 원형을 만들지 못함)
-> 따라서 템플릿은 파일분할을 하지 않는다!
#template에서의 static
지난 글 중 class내에서 static 멤버변수는 전역에서 초기화하고, 객체를 다르게 생성해도 static변수를 공유해서 같은 값이 나오는 것을 확인할 수 있었다.
#28. static, this, extern, 복사생성자 (tistory.com)
#28. static, this, extern, 복사생성자
#11. 지역변수, 전역변수 및 메모리구조 (2) (tistory.com) #11. 지역변수, 전역변수 및 메모리구조 (2) # 지역변수, 전역변수 #10. 함수 및 메모리 구조 (tistory.com) 재사용성이 좋기 때문에 자주 사용한다.
hyukee.tistory.com
하지만 template으로 했을때는 어떨까?
template으로 했을 때 class의 멤버변수로 static T m_A; 라고 했을 때,
객체를 다르게 생성해도 멤버변수를 공유한다는 점은 동일하지만
자료형이 같은 객체끼리만 공유하는 것을 확인 할 수 있다.
예를 들면
class CLS에
T m_A; 라는 멤버변수를 선언 했을 때, (여기서 T는 template <typename T>의 T이다)
객체 생성을
CLS<int> i_cls;
CLS<int> i_cls2;
CLS<float> f_cls;
을 한다고 하면
i_cls.m_A 와 i_cls2.m_A 는 같은 자료형(int) 이라, m_A의 값을 공유하지만
f_cls와는 공유하지 않는것을 찾아 볼 수 있다.
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
class CLS
{
public:
CLS() {}
~CLS() {}
static T m_A;
};
template <typename T>
T CLS<T>::m_A = 0;
void main()
{
CLS<int> i_cls;
CLS<int> i_cls2;
CLS<float> f_cls;
++i_cls.m_A;
++i_cls2.m_A;
cout << "i_cls.m_A: " << i_cls.m_A << endl;
cout << "i_cls2.m_A: " << i_cls2.m_A << endl;
cout << "f_cls.m_A: " << f_cls.m_A << endl;
}
#템플릿 상속
클래스에서 템플릿 상속도 가능하다.
클래스명 위에 template <typename T>를 명시해주면 된다.
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
class CLS
{
};
template <typename T>
class Child : public CLS<T>
{
};
void main()
{
Child<int> a;
}
'개발 Study' 카테고리의 다른 글
#37. Vector (0) | 2021.05.23 |
---|---|
#36. STL (Standard Template Library) 정의 (0) | 2021.05.22 |
#34. Template 및 inline (0) | 2021.05.20 |
#33. operator 연산자 오버로딩 (0) | 2021.05.18 |
#32. 바인딩 (0) | 2021.05.14 |