반응형


//***********************************************************
// 템플릿 !! 
//***********************************************************
// 일반화 프로그래밍 !!
//  -->  반복적으로 작성해야할 코드를 하나의 코드로 모두 해결하는것 !! 

//  월평동 ---->              

//  용전동 ---->   대전ic -->  대캠 --> 계룡--> 연산           논산 

//  송촌동 ---->   대전ic --> 

//  노은동 ---->   유성IC --> 

//  


/*
기름값 * 4 
피로도 * 4
시간   * 4 
템플릿 template  - ppt, 홈페이지 !! ㅅ
*/
#include 
using 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

+ Recent posts