class TestClass
{
 public:
    int badMember;
    void test(int x) {...}
};
int main()
{
    TestClass testClass;
    testClass.test(3);
}

...
struct TestStruct
{
    int badMember;
    void (*test)(TestStruct*, int);  
};
void TestStruct_test(TestStruct*, int x) {}...

int main()
{
    TestStruct testStruct;
    testStruct.test = &TestStruct_test;
    testStruct.test(&testStruct, 3);  // or TestStruct_test(&testStruct, 3);
}

encapsulation은 대강 다음과 같이 할 수 있습니다.

/* in header */
struct PrivateInterface;

struct PublicInterface
{
    PrivateInterface* privateDataOrFunction;
    int publicData;
}

/* in code */
struct PrivateInteface
{
    ....
}



C++ 소스

class Person {
 int age;
public:
 void setAge(const int age);
 int getAGe() const;
};

이걸 C로 구현하면 아래와 같습니다.

#include <stdio.h>

struct Person {
 int age;
 void (*setAge)(struct Person * this, const int age);
 int (*getAge)(const struct Person * this);
};

void Person_setAge(struct Person * this, const int age)
{
  this->age = age;
}

int Person_getAge(const struct Person * this)
{
 return this->age;
}

void Person_init(struct Person * this)
{
 this->setAge = Person_setAge;
 this->getAge = Person_getAge;
}

void Person_destroy(struct Person * this)
{
}

int main()
{
 struct Person minsu;

 /* 생성자 호출 */
 Person_init(&minsu);

 minsu.setAge(&minsu, 10);
 printf("%d\n", minsu.getAge(&minsu));

 /* 소멸자 호출 */
 Person_destroy(&minsu);
 return 0;
}


[출처 : http://kldp.org/node/58392]

+ Recent posts