http://bbs.kldp.org/viewtopic.php?t=69993&postdays=0&postorder=asc&highlight=void+%2Athis&start=40

요즘 KLDP에서 C를 C++처럼 사용하는 법에 대해서 토론중이다.
(OOP, 프레임웍, 패턴이라는 단어들이 사용하면서 긴장을 풀고 살았다라는 생각이 드는 것은 무엇일런지..
초심의 마음으로 다시 접근해야 겠다.)



#include <stdio.h>

struct _my_str;

void inc_one(struct _my_str *);
void dec_one(struct _my_str *);

typedef void (*void_func) (struct _my_str *);

typedef struct _my_str {
   int iLen;
   void_func inc;
   void_func dec;
} my_str;

my_str* init_my_str() {
   my_str *new_my_str = (my_str*) malloc (sizeof(my_str));
   new_my_str->iLen = 0;
   new_my_str->inc = &inc_one;
   new_my_str->dec = &dec_one;
   return new_my_str;
}

void inc_one(my_str *my) {
   my->iLen++;
}

void dec_one(my_str *my) {
   my->iLen--;
}

main() {
   my_str *a = init_my_str();
   printf("a->iLen = %d\n", a->iLen);
   a->inc(a);
   printf("a->iLen = %d\n", a->iLen);
}

함수포인터를 이용하여 구현한 것으로서, 자신의 객체를 내부에서 구현하고 참조하는 C++, java의 실제 내부 구현이기도 하다.
전역변수를 쓰지 않음으로서 메모리를 아끼고, 마치 객체처럼 편리하게 쓰일 수 있다. OOP의 encapsulation처럼 쓰일 수 있는 장점이 있다. 물론 structure의 변수들을 모두 접근한다는 부분이 걸리지만 말이다.
 
Herb Sutter 님의 Exceptional C++ 에서는 다음과 같이 c를 이용하여 OOP의 편리함을 이용하고 있다.

List of "foo.c" :
코드:
#include "bar.h"

int main()
{
 BAR *bar = create_bar();
 use_bar(bar);
 remove_bar(bar);
 return 0;
}


List of "bar.c" :
코드:
#include "bar.h"

struct BAR_
{
int somedata1;
int somedata2;
void *memory;
};
typedef struct BAR_ BAR;

BAR *create_bar() { static BAR b; return &b; }
void use_bar(BAR *) {  }
void remove_bar(BAR *) { }


List of "bar.h" :
코드:
struct BAR_;

struct BAR_ *create_bar();
void use_bar(struct BAR_ *);
void remove_bar(struct BAR_ *);
Posted by 김용환 '김용환'

댓글을 달아 주세요