Cでオブジェクトの向きを作成する方法の基本を次に示します。
1.オブジェクトの作成とカプセル化
通常-次のようなオブジェクトを作成します
object_instance = create_object_typex(parameter);
メソッドは、ここで2つの方法のいずれかで定義できます。
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は、パブリックメソッドとプライベートメソッドに拡張できる関数ポインターとして定義されます。
また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);
ここでdoctor
とengineer
は人から派生したもので、より高いレベルに型キャストすることが可能です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のオブジェクト指向は、その定義にそれほど厳密ではないことを知っています。しかし、そのように働くことは、いくつかのコア原則を理解するでしょう。
重要なことは、オブジェクト指向がC ++やJAVAほど厳密ではないということです。オブジェクト指向の考え方を念頭に置いてコードを構造的に整理し、そのように操作できるということです。
libjpegの実際のデザインと次のリソースを参照することを強くお勧めします
a。Cでのオブジェクト指向プログラミング
b。これは人々がアイデアを交換するのに適した場所
ですc。そして、ここに完全な本があります
extern "C"
pythonから使用できるようにすることができます。手動で行うことも、SWIGに支援してもらうこともできます。したがって、Pythonフロントエンドへの欲求は、C ++を使用しない理由にはなりません。Cにとどまる正当な理由がないと言っているわけではありません。