오늘도 어제에 이어 문서파일들을 정리하는 중인데, class_c라는 파일이 있어 열어보니.
학부 시절, C언어로 객체를 구현해서 오라는 과제가 있어서 만들어봤던 마린 클래스 소스였다.
현업하면서 BREW 라는 플래폼을 사용할때 C언어로 객체를 구현했길래 그 안을 들여다 보니.. 그방법이 똑같았다. ^.^
//함수형 포인터를 이용해서 클래스를 흉내내어 본다. //구현해볼 클래스는 '마린' 클래스인데, CMarine구조체에 보면 7개의 속성등을 선언해뒀고, //그 것들을 조정하는 함수를 14개의 함수형 포인터로 선언해두었으며, //각각의 상태를 출력해주는 함수도 같이 포함되어 있다. #include <stdio.h> #include <stdlib.h> #define ON 1 //스팀팩의 사용여부를 나타는 값. #define OFF 0 //구조체 선언한다.(클래스처럼 사용하기 위한 구조체) struct CMarine { //상태를 저장하는 변수를 선언한다. int m_nLife; int m_nSpeed; int m_nStimPack; /*1 stimpack on, 0 otherwise.*/ int m_nAttackDamage; int m_nAttackRange; int m_nWeaponUpLv; int m_nArmorUpLv; //상태를 셋팅하는 함수를 각각 함수형 포인터로 선언한다. void (*SetLife)(CMarine *pMarine,int Life); void (*SetSpeed)(CMarine *pMarine,int Speed); void (*SetStimPack)(CMarine *pMarine,int StimPack); void (*SetAttackDamage)(CMarine *pMarine,int AttackDamage); void (*SetAttackRange)(CMarine *pMarine,int AttackRange); void (*SetWeaponUpLv)(CMarine *pMarine,int WeaponUpLv); void (*SetArmorUpLv)(CMarine *pMarine,int ArmorUpLv); //각각의 상태를 출력해주는 함수를 각각 함수형 포인터로 선언한다. void (*PrintStatus)(CMarine *pMarine); //각각의 저장된 값을 불러오는 함수를 각각 함수형 포인터로 선언한다. int (*GetLife)(CMarine *pMarine); int (*GetSpeed)(CMarine *pMarine); int (*GetStimPack)(CMarine *pMarine); int (*GetAttackDamage)(CMarine *pMarine); int (*GetAttackRange)(CMarine *pMarine); int (*GetWeaponUpLv)(CMarine *pMarine); int (*GetArmorUpLv)(CMarine *pMarine); }; //클래스처럼 사용할 수 있는 구조체의 정의 끝. //각 함수들을 구현해준다. void SetLife(CMarine *pMarine, int Life){ pMarine->m_nLife=Life; } void SetSpeed(CMarine *pMarine,int Speed){ pMarine->m_nSpeed=Speed; } void SetStimPack(CMarine *pMarine,int StimPack){ pMarine->m_nStimPack=StimPack; } void SetAttackDamage(CMarine *pMarine,int AttackDamage){ pMarine->m_nAttackDamage=AttackDamage; } void SetAttackRange(CMarine *pMarine,int AttackRange){ pMarine->m_nAttackRange=AttackRange; } void SetWeaponUpLv(CMarine *pMarine,int WeaponUpLv){ pMarine->m_nWeaponUpLv=WeaponUpLv; } void SetArmorUpLv(CMarine *pMarine,int ArmorUpLv){ pMarine->m_nArmorUpLv=ArmorUpLv; } int GetLife(CMarine *pMarine){ return pMarine->m_nLife; } int GetSpeed(CMarine *pMarine){ return pMarine->m_nSpeed; } int GetStimPack(CMarine *pMarine){ return pMarine->m_nStimPack; } int GetAttackDamage(CMarine *pMarine){ return pMarine->m_nAttackDamage; } int GetAttackRange(CMarine *pMarine){ return pMarine->m_nAttackRange; } int GetWeaponUpLv(CMarine *pMarine){ return pMarine->m_nWeaponUpLv; } int GetArmorUpLv(CMarine *pMarine){ return pMarine->m_nArmorUpLv; } CMarine *NewCMarine();//생성자 함수이다.(초기값을 설정해주고.메모리를 할당 받는다.) void DestroyCMaine(CMarine *);//소멸자 함수.(메모리 반환) void PrintStatus(CMarine *);//상태를 출력해 주는 함수. int main(){ CMarine *pMarine=NewCMarine();//생성자로 클래스를 하나 만든다. pMarine->PrintStatus(pMarine);//초기 상태를 출력한다. //값을 세팅해준다. pMarine->SetLife(pMarine,40); pMarine->SetSpeed(pMarine,10); pMarine->SetAttackDamage(pMarine,6); pMarine->SetAttackRange(pMarine,4); //세팅할 때 GetXXXXX함수를 사용해서 저장된 값을 불러온 다음 업그레이드 한다. pMarine->SetArmorUpLv(pMarine,(pMarine->GetArmorUpLv(pMarine))+1); pMarine->SetWeaponUpLv(pMarine,(pMarine->GetWeaponUpLv(pMarine))+1); pMarine->SetStimPack(pMarine,ON); //셋팅후의 상태를 출력한다. pMarine->PrintStatus(pMarine); DestroyCMaine(pMarine);//메모리 반환(소멸자 함수를 명시적으로 호출한다.) return 0;//에러 없음 } //상태를 출력해주는 함수(변수를 바로 접근할 수도 있지만, GetXXXXX함수들을 이용한다. void PrintStatus(CMarine *pMarine){ printf("_______Status Information_______\n"); printf("Life :\t %d\n",pMarine->GetLife(pMarine)); printf("Speed :\t %d\n",pMarine->GetSpeed(pMarine)); printf("Attack Damage :\t %d\n",pMarine->GetAttackDamage(pMarine)); printf("Attack Range :\t %d\n",pMarine->GetAttackRange(pMarine)); printf("Armor Upgrade Level :\t %d\n",pMarine->GetArmorUpLv(pMarine)); printf("Weapon Upgrade Level :\t %d\n",pMarine->GetWeaponUpLv(pMarine)); printf("Stim Pack :\t %s\n",pMarine->GetStimPack(pMarine)==1 ? "ON":"OFF"); printf("________________________________\n"); } //생성자 함수의 구현. CMarine *NewCMarine(){ //메모리 할당 CMarine *pMarine=(CMarine *)malloc(sizeof(CMarine)); //각함수의 주소를 저장한다.(포인터로 접근하게 함) pMarine->SetArmorUpLv=SetArmorUpLv; pMarine->GetArmorUpLv=GetArmorUpLv; pMarine->SetAttackDamage=SetAttackDamage; pMarine->GetAttackDamage=GetAttackDamage; pMarine->SetAttackRange=SetAttackRange; pMarine->GetAttackRange=GetAttackRange; pMarine->SetLife=SetLife; pMarine->GetLife=GetLife; pMarine->SetSpeed=SetSpeed; pMarine->GetSpeed=GetSpeed; pMarine->SetStimPack=SetStimPack; pMarine->GetStimPack=GetStimPack; pMarine->SetWeaponUpLv=SetWeaponUpLv; pMarine->GetWeaponUpLv=GetWeaponUpLv; pMarine->PrintStatus=PrintStatus; //초기값 설정준다. pMarine->m_nArmorUpLv=0; pMarine->m_nAttackDamage=0; pMarine->m_nAttackRange=0; pMarine->m_nLife=0; pMarine->m_nSpeed=0; pMarine->m_nStimPack=0; pMarine->m_nWeaponUpLv=0; return pMarine; } //소멸자 함수 void DestroyCMaine(CMarine *pMarine){ free(pMarine);//메모리 반환 }
'코딩하고 > C,C++' 카테고리의 다른 글
OS - Page Fault Simulation(FIFO,LRU,Optimal) (0) | 2012.10.21 |
---|---|
자료구조 - 계산기 만들기 (10) | 2012.10.12 |
자료구조 - 다항식 연산하기 (2) | 2012.10.10 |
ls 명령어 구현하기. (2) | 2012.10.09 |
조건문 제거하기 - Function Table사용법 (0) | 2012.08.11 |