1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | // TemplateNode.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. // #include "stdafx.h" #include "Node.h" #include "MyData.h" using namespace std; int main() { //숫자 테스트 Node<int> num; num.Push(1); num.Push(10); num.Push(100); cout << " Node Size() : " << num.Size() << endl; cout << " Node At(2) : " << num.At(2) << endl; cout << "Node operator[0] : " << num[0]<< endl; //Class로 테스트 Node<MyData> Datas; for (int i = 0; i < 5; ++i) { int num = 10; for (int j = 0; j < i; ++j) { num = num * 10; } MyData data = MyData(num); Datas.Push(data); } //출력 cout << " Node Size() " << Datas.Size() << endl; for (int i = 0; i < Datas.Size(); ++i) { cout << i << " 번째 : " << Datas[i].GetNum() << endl; } // 0 번 노드를 삭제해본다. cout << " 0 번째 node Erase " << endl; Datas.Erase(0); //다시 출력 cout << " Node Size() " << Datas.Size() << endl; for (int i = 0; i < Datas.Size(); ++i) { cout << i << " 번째 : " << Datas[i].GetNum() << endl; } return 0; } | cs |
템플릿 기반의 클래스는 템플릿이 리얼타임으로 생성되지 않아 생성자 오류가 일어난다.
그러므로 템플릿 클래스 생성시 헤더에서 함수 작성을 해주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | #pragma once template<class T> class Node { public: Node() { m_Next = nullptr; } public: //Data를 저장하고 다음 노드를 생성한다. void Push(T data) { if (m_Next == nullptr) { m_Next = new Node<T>(); m_Data = data; } else { m_Next->Push(data); } } // Data가 들어있는 Node의 길이를 리턴한다. int Size() { int count = 1; if (m_Next) { count += m_Next->Size(); } else { count = 0; } return count; } // 해당 번호에 있는 데이타를 리턴한다. T At(int num) { if (num <= 0) { return m_Data; } else { num--; return m_Next->At(num); } } // [번호] 번호 안에 있는 데이타를 리턴한다. (연산자 오버로딩) T operator[](int num) { if (num <= 0) { return m_Data; } else { num--; return m_Next->At(num); } } // 모든 노드를 지운다. void Clear() { if (m_Next) { m_Next->Clear(); } delete this; } //번호에 해당하는 노드를 삭제한다. void Erase(int num) { if (num <= 0) { m_Data = m_Next->m_Data; Node* nextnext = m_Next->m_Next; delete m_Next; //m_Next->Destroy(); m_Next = nextnext; } else { num--; m_Next->Erase(num); } } private: T m_Data; Node<T>* m_Next; }; | c s |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #pragma once class MyData { private: int m_Num; public: MyData(); MyData(int num); ~MyData(); int GetNum() { return m_Num; } }; #include "stdafx.h" #include "MyData.h" MyData::MyData() { m_Num = 0; } MyData::MyData(int num) { m_Num = num; } MyData::~MyData() { } | cs |
'프로그래밍 > 코딩' 카테고리의 다른 글
자료형 (0) | 2016.04.11 |
---|---|
비트단위 연산자. &, |, ^, ~, <<, >> (0) | 2016.04.11 |
랜덤 난수 생성 함수 와 메르센 트위스터 (0) | 2016.01.28 |
try -> throw -> cahth (0) | 2015.07.04 |
상속 그리고 동적할당. 소멸자에 virtual (0) | 2015.05.17 |