이 게시물에 기반하여 C에서 데이터 캡슐화를 시도했습니다. https://alastairs-place.net/blog/2013/06/03/encapsulation-in-c/. 헤더 파일에 C에서 데이터 캡슐화를 사용하는 OOP 프로그래밍
제가 가지고 'functions.c'에서#ifndef FUNCTIONS_H
#define FUNCTIONS_H
// Pre-declaration of struct. Contains data that is hidden
typedef struct person *Person;
void getName(Person obj);
void getBirthYear(Person obj);
void getAge(Person obj);
void printFields(const Person obj);
#endif
은 내가 아니라 함수를 정의하는
#include "Functions.h"
enum { SIZE = 60 };
struct person
{
char name[SIZE];
int birthYear;
int age;
};
PLUSS 같은 구조를 정의 하였다. main.c의에서
나는이 :
#include "Functions.h"
#include <stdlib.h>
int main(void)
{
// Works because *Person makes new a pointer
Person new = malloc(sizeof new);
getName(new);
getAge(new);
getBirthYear(new);
printFields(new);
free(new);
return 0;
}
내가 Person new
를 사용하는 경우, new
이미 때문에 typedef struct person *Person;
의 포인터 것을, 그것이 사실입니다.
struct person
에서 선언 한 몸과 멤버를 볼 수 링커이 가능한 경우에만 사용하여 포인터가 어떻게
?
지금처럼 functions.h
의 다른 struct
를 만들기 위해 내 경우에는 OOP의 prinicples을 구현하는 올바른 (유일한) 방법입니다 모두의
typedef struct classPerson
{ // This data should be hidden
Person data;
void (*fPtrGetName)(Person obj);
void (*fPtrBirthYear)(Person obj);
void (*fPtrGetAge)(Person obj);
void (*fPtrPrintFields)(const Person obj);
} ClassPerson;
절대'typedef' 포인터가 없습니다! 그것은 혼동을 보장하고 객체에'const' 한정자를 사용하는 것을 금지합니다. 그것이 링크 된 사이트에서 온 것이라면 틀립니다. 그냥'typedef'구조체'. 그리고 그것은 OOP가 아니라 정보 숨기기입니다. – Olaf
@Olaf 정보 숨기기, 일명 개인 캡슐화는 OOP의 필수 구석 중 하나입니다. 나머지는 모듈 식 디자인과 상속입니다. 이 3 가지 방법 모두를 통해 달성 할 수 있습니다. 적절한 OOP를 위해서는 그 외에는 다른 것을 필요로하지 않습니다. OO를 지원하는 언어로 우연히 발견 할 수있는 다른 모든 것들은 다양한 유용성을 가지고 있습니다. – Lundin
@ 런 딘 :별로.OOP의 주된 문제는 그것들을 ** 조작하는 기능을 제공하는 객체입니다 **. 그래도 개체와 메서드가 분리되어 있으면 OOP가 없습니다. 모듈 식 프로그래밍만큼이나 OOP가 아닙니다. 이것은 모든 현대 프로그래밍 언어의 표준입니다. 나는 OOP의 필수 부분 인 상속에 동의하는지 잘 모르겠습니다. 오리 타이핑은? OOP가 없으며 인터페이스가 동일합니다. – Olaf