오늘도 어제에 이어 문서파일들을 정리하는 중인데, 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 |