C에서 객체 방향을 만드는 방법의 기본 사항은 다음과 같습니다.
1. 객체와 캡슐화 만들기
일반적으로-다음과 같은 객체를 만듭니다.
object_instance = create_object_typex(parameter);
여기에서 두 가지 방법 중 하나로 방법을 정의 할 수 있습니다.
object_type_method_function(object_instance,parameter1)
OR
object_instance->method_function(object_instance_private_data,parameter1)
대부분의 경우 object_instance (or object_instance_private_data)반환되는 유형 void *.은 응용 프로그램입니다. 응용 프로그램은이 멤버의 개별 멤버 또는 함수를 참조 할 수 없습니다.
이 외에도 각 메소드는 후속 메소드에 이러한 object_instance를 사용합니다.
2. 다형성
많은 함수와 함수 포인터를 사용하여 런타임에 특정 기능을 재정의 할 수 있습니다.
예를 들어, 모든 object_methods는 개인 메소드뿐만 아니라 public으로 확장 될 수있는 함수 포인터로 정의됩니다.
var_args printf에 정의 된 가변 개수의 인수와 매우 유사한 방식으로 함수 오버로드를 제한된 의미로 적용 할 수도 있습니다 . 예, 이것은 C ++에서 유연하지는 않지만 가장 가까운 방법입니다.
3. 상속 정의
상속을 정의하는 것은 약간 까다 롭지 만 구조를 사용하여 다음을 수행 할 수 있습니다.
typedef struct {
int age,
int sex,
} person;
typedef struct {
person p,
enum specialty s;
} doctor;
typedef struct {
person p,
enum subject s;
} engineer;
// use it like
engineer e1 = create_engineer();
get_person_age( (person *)e1);
여기에서 doctorand engineer는 person에서 파생되며 더 높은 수준으로 타입 캐스트 할 수 person있습니다.
이에 대한 가장 좋은 예는 GObject 및 파생 개체에서 사용됩니다.
4. 가상 클래스 만들기
모든 브라우저에서 jpeg 디코딩에 사용하는 libjpeg라는 라이브러리에서 실제 예제를 인용하고 있습니다. 응용 프로그램이 구체적인 인스턴스를 생성하고 다시 공급할 수있는 error_manager라는 가상 클래스를 만듭니다.
struct djpeg_dest_struct {
/* start_output is called after jpeg_start_decompress finishes.
* The color map will be ready at this time, if one is needed.
*/
JMETHOD(void, start_output, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo));
/* Emit the specified number of pixel rows from the buffer. */
JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo,
JDIMENSION rows_supplied));
/* Finish up at the end of the image. */
JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
djpeg_dest_ptr dinfo));
/* Target file spec; filled in by djpeg.c after object is created. */
FILE * output_file;
/* Output pixel-row buffer. Created by module init or start_output.
* Width is cinfo->output_width * cinfo->output_components;
* height is buffer_height.
*/
JSAMPARRAY buffer;
JDIMENSION buffer_height;
};
여기서 JMETHOD는 매크로를 통해 함수 포인터로 확장되며 각각 올바른 메소드로로드되어야합니다.
나는 너무 많은 개인적인 설명없이 많은 것을 말하려고 노력했습니다. 그러나 나는 사람들이 자신의 것을 시도 할 수 있기를 바랍니다. 그러나 내 의도는 사물이 어떻게 매핑되는지 보여주는 것입니다.
또한 이것이 C ++에 해당하는 속성 이 아니라는 많은 주장이 있습니다 . 나는 C의 OO가 그 정의에 엄격하지 않다는 것을 안다. 그러나 그런 식으로 일하면 몇 가지 핵심 원칙을 이해할 것입니다.
중요한 것은 OO가 C ++ 및 JAVA만큼 엄격하지 않다는 것입니다. OO 사고를 염두에두고 코드를 구조적으로 구성하고 그렇게 운영 할 수 있다는 것입니다.
나는 사람들에게 libjpeg 의 실제 디자인 과 다음 자료 를 볼 것을 강력히 권합니다.
ㅏ. C에서의 객체 지향 프로그래밍
b. 사람들이 아이디어를 교환 할 수있는 좋은 장소
입니다. c. 그리고 여기에 전체 책이 있습니다
extern "C"파이썬에서 사용할 수 있습니다. 수동으로 수행하거나 SWIG가 도움을 줄 수 있습니다 . 따라서 파이썬 프론트 엔드에 대한 욕구는 C ++을 사용하지 않는 이유가 아닙니다. C와 함께 머물고 싶은 타당한 이유가 없다고 말하는 것은 아닙니다.