반응형
//*********************************************************** // 템플릿 !! //*********************************************************** // 일반화 프로그래밍 !! // --> 반복적으로 작성해야할 코드를 하나의 코드로 모두 해결하는것 !! // 월평동 ----> // 용전동 ----> 대전ic --> 대캠 --> 계룡--> 연산 논산 // 송촌동 ----> 대전ic --> // 노은동 ----> 유성IC --> // /* 기름값 * 4 피로도 * 4 시간 * 4 템플릿 template - ppt, 홈페이지 !! ㅅ */ #includeusing namespace std; // 템플릿 함수 !! // ---> 로직 --> 코딩이 같아야한다 !! // ---> 타입의 차이만 나는경우 !! /* int sum( int x , int y) { return x + y; } double sum( double x , double y) { return x + y; }*/ // typename //1) 로직이 동일 //2) 타입 때문에 여러가지를 만들어야하는경우 !! template void Swap( T * x , T * y ) { T temp = *x; *x = *y; *y = temp; } // 템플릿 특수화 !!! template void Swap( T x , T y ) { T temp = x; x = y ; y = temp; } // malloc : 할당하는 함수 --> 일반화가 되어있는 함수 !! // C언어에서는 일반화 void * 일반화 !! // 신탄진 -->!! template< typename T> T * Malloc( T x , int size) { return (T*)malloc( sizeof(T) * size); } class Point { public : int x; int y; Point & operator+( Point & p) { Point temp; temp.x = this->x + p.x; temp.y = this->y + p.y; return temp; } }; template < typename T1 , typename T2> T1 sum( T1 x , T2 y) // 기존에 자료형 때문에 여러개를 만들어야하는 자리에 T { return x + y; } void main() { Point p1 ={1,2}; Point p2 ={3,4}; Point p3 = sum( p1, p2); cout << p3.x << p3.y << endl; // char x = 97; // char y = 98; // cout << x << y << endl; // Swap(&x , &y); // cout << x << y << endl; }
//******************************************** // 템플릿 ( template) 클래스 !! //******************************************** #include#include #define DEFAULT_SIZE 16 using namespace std; template < typename T> class Array { private: T * m_buf; // 동적배열 포인터 !! int m_size; // 현재 데이타의 갯수 !! int m_capacity; // 전체 용량 public : Array() //기본 생성자 !! { m_buf = new T[DEFAULT_SIZE]; memset( m_buf, 0, DEFAULT_SIZE ); m_size = 0; m_capacity = DEFAULT_SIZE; } Array( int capa) { m_buf = new T[capa]; memset( m_buf, 0, capa ); m_size = 0; m_capacity = capa; } // 1) 인덱스 기능 !!! T operator[] (int index) { return m_buf[index]; } //1) 리사이즈 : 배열의 크기를 변경 !! void Resize( int newCapa) { m_capacity = newCapa; T * temp = new T[m_capacity]; memcpy( temp, m_buf, sizeof( T ) * m_size ); delete [] m_buf; m_buf = temp; } // 2) 자동 증가 !! --> 배열에 값이 인서트가 되면 !! void push_back( T data ) //배열에 마지막에 값을 하나 삽입 !! { if( m_size == m_capacity) Resize( m_capacity *2 ); // _msize: heap에 할당된 메모리의 크기 !! m_buf[m_size] = data; m_size++; } void pop_back() //배열의 맨뒤에서 1개 삭제 !! -->0으로 초기화 !! { m_buf[m_size] = 0; m_size--; } //************************************************************************* // 1) 삽입 // - insert ( int index , int value ) // 1개 // - insert ( int index, int value[] ); // 여러개의 값을 넣어라 !! // 2) 삭제 // erase (int index): index한개 지워라 !! // erase ( int value) // 배열안에서 value값을 처음에 있는 한개를 지워라 !! // clear() : 초기화 !! // 3) 유틸리티 // - reverse : 뒤집어라 --> 10 , 20, 30, --> 30, 20, 10 //************************************************************************* int getSize(){ return m_size; } int getCapacity(){return this->m_capacity; } ~Array() { //메모리 해제 !! delete [] m_buf; } // 객체 출력자 !! void show() { for(int i = 0; i< m_size; i++) cout << "[ " << m_buf[i] << " ]"; cout << endl; } }; // 클래스 템플릿 특수화 !! template ostream & operator<<( ostream & os , Array & ar) { ar.show(); return os; } template <> class Array { private: int** m_buf; // 동적배열 포인터 !! int m_size; // 현재 데이타의 갯수 !! int m_capacity; // 전체 용량 public : Array() //기본 생성자 !! { m_buf = new int*[DEFAULT_SIZE]; memset( m_buf, 0, DEFAULT_SIZE ); m_size = 0; m_capacity = DEFAULT_SIZE; } Array( int capa) { m_buf = new int*[capa]; memset( m_buf, 0, capa ); m_size = 0; m_capacity = capa; } // 1) 인덱스 기능 !!! int* operator[] (int index) { return m_buf[index]; } //1) 리사이즈 : 배열의 크기를 변경 !! void Resize( int newCapa) { m_capacity = newCapa; int** temp = new int*[m_capacity]; memcpy( temp, m_buf, sizeof( int* ) * m_size ); delete [] m_buf; m_buf = temp; } // 2) 자동 증가 !! --> 배열에 값이 인서트가 되면 !! void push_back( int* data ) //배열에 마지막에 값을 하나 삽입 !! { if( m_size == m_capacity) Resize( m_capacity *2 ); // _msize: heap에 할당된 메모리의 크기 !! m_buf[m_size] = data; m_size++; } void pop_back() //배열의 맨뒤에서 1개 삭제 !! -->0으로 초기화 !! { m_buf[m_size] = 0; m_size--; } //************************************************************************* // 1) 삽입 // - insert ( int index , int value ) // 1개 // - insert ( int index, int value[] ); // 여러개의 값을 넣어라 !! // 2) 삭제 // erase (int index): index한개 지워라 !! // erase ( int value) // 배열안에서 value값을 처음에 있는 한개를 지워라 !! // clear() : 초기화 !! // 3) 유틸리티 // - reverse : 뒤집어라 --> 10 , 20, 30, --> 30, 20, 10 //************************************************************************* int getSize(){ return m_size; } int getCapacity(){return this->m_capacity; } ~Array() { //메모리 해제 !! delete [] m_buf; } // 객체 출력자 !! void show() { for(int i = 0; i< m_size; i++) cout << "[ " << *m_buf[i] << " ]"; cout << endl; } }; class Market { Array arr; }; void main() { Array arr[10]; // 2차원 Array< Array > arr; // 2차원 !! Array< Market > arr; // 2차원 }
'C, C++' 카테고리의 다른 글
[C++] String class (0) | 2014.11.18 |
---|---|
[C++] 동적 배열 클래스 (0) | 2014.11.18 |
[C++] () 연산자 오버로딩 !! (0) | 2014.11.18 |
[C++] 전역 함수를 이용한 연산자 오버로딩 (0) | 2014.11.18 |
[C++] 연산자 오버로딩 (0) | 2014.11.18 |