오늘도 어제에 이어 문서파일들을 정리하는 중인데, 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);//메모리 반환
}
블로그 이미지

커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

,