Cの構造体のプライベートメンバ
今週、仕事ここでは、C + +でプログラミングしているので、そうではない、すなわち、あなたのコードがオブジェクト指向されるのg + +でコンパイル、より多くの証拠をプログラミングパラダイムは何か完全に独立した言語ですいたANSI Cでいる場合は、プログラムがほとんど、あなたのコードは、構造化する必要がありますかができないオブジェクト指向プログラミングされます。
私は右の読んでいる、オブジェクト指向ANSI Cで?
[はい]とは!
継承のようなものは、ポリモーフィズム、オーバーロードは、/ Cでエミュレートすることが困難ですが、同様の向きをオブジェクトに動作スタイルを使用してプログラムすることができます。 libdfb はCで書かれていますが、"オブジェクトが同様にオブジェクト指向"を、そうは、非常に動作は、作成の要素を操作破壊する。
ここでは仕事で、我々はC言語でハードウェアアブストラクションのGUIのC + +で接続するシステムがある。 下位層は、また、C言語で(と書かれて非常によく書かれ、この方法で教えて)これらのテクニックと、オブジェクト指向をシミュレートします。 1つは、これらのテクニックは、私は1つをCの本それらの脚注の着用に感銘を受けました
コンパイル単位で、それがされたユニット宣言で宣言されたにexternがない限り、再度、他の内が表示されコンパイルのみですCのシンボルコードは、各。 したがって、それは可能""あなたのコンパイル単位内の特定のシンボルを隠すために、彼らは外の世界にアクセスできないようです。 我々は、このパッケージでいる。
コンパイル単位のファイルセットを一度に処理中古コンパイルされたコードは、1つのオブジェクトを生成します。 基本的に(ただし、正確に)、我々は、各コンパイル単位の実装ファイルのソースコード(*. cを*. cppを。等)としてかかることがあります。 の詳細についてはさらにコンパイルの手順を実行しますCやC + +は、見つけることができるブログCaloni 。
この情報を使用して、我々はでの内部のメンバーは"プライベートな構造体はANSI Cを作成することができます。" 魔法がトラップ状態の定義でコンパイル単位内では、これらのメンバへのアクセスメソッドを作成します。 この私たちは私たちの宣言とCの要素の定義の違いを示す脚注を:使用について
宣言、またはマニフェスト:コンパイラの意味について、その多くを語って提示せずに識別子を、すなわち、コンパイラが識別子XXXが存在する場合、指示はほとんど表し、彼が何について知られ。
例:
a ; にextern int型 。 void ) ; ボイド何とか(ボイド); 構造 st_data;
定義や実装:指示コンパイラは、識別子が物事他の判断間のメモリであることが多くどのようになど、割り当てに、何のメモリ、それを見つけるアドレスすることができます私たちは。
例:
int型 。 void ) { /* Do anything. ボイド何とか(ボイド)(/ *何かをしないでください。 * /) /* Some members. メンバー追加 st_data 構造 (/ *です。 * /)
私達の構造と種類of、何も約わかっているためにのためにメモリを割り当てることができますコンパイラを設定せずに話すhow much空間はtype needの変数。 一方、宣言もせずに、リンカがどのようなシンボルが存在する知ることはできません。
私達は、通常我々はまた、そこand every time我々は我々のof source to、このヘッダーを追加、そのメンバーをdefineヘッダの構造を宣言する、我々はコンパイル単位でincluded thatのメンバを作るこの構造体の定義として両方の消息筋は談話、our entire publicこのコンパイルユニットに。 これは、私たちが直接そのメンバにアクセスすることができます。
構造体を使用できませんが、そのメンバーを表す私たちは定義のステートメントを区切る場合、唯一のシンボルです。 したがって、メンバに直接アクセスするいかなる試みも、コンパイルエラーを生成します。 興味深い副作用は、コンパイラは、structureのサイズについては何も知っているasは、は直接、唯一のpointerにto、pointersはすべて同じサイズとcompilerをしてbecauseのみsymbol名が必要type構造のvariableを設定できません。型へのポインタを作成します。
このような我々は、mytype.hヘッダー:
#ifndefのMY_TYPE_H #はMY_TYPE_Hを定義する / * typedefは構造体の言葉は繰り返していないだけに。 * / / *文を*のみキーワード:/ / * *構造体_mytypeの/ typedefは my_type 構造 体 _mytypeの。 my_type ** ) ; ボイド create_my_type(my_type **); my_type ** ) ; ボイド destroy_my_type(my_type **); my_type * , int ) ; ボイド set_data(my_typeの *は、int); my_type * ) ; int型 get_data(my_typeの*); my_type * , const char * ) ; ボイドセット_(my_typeの *、const char *を); get_text ( my_type * ) ; char * 文字 get_text(my_typeの*); #endifの
実装はmytype.c:
_mytype { /* Aqui fica a definição da estrtura. #あり"mytype.h"<stdio.h>が する* /#( 含める 構造 <stdlib.h>の<string.h>にの_mytype#は含まれて#が含ま ここestrtura定義のです。 data ; /* Somente depois disso é que o com- */ int text [ 21 ] ; /* pilador vai saber como alocá-la. * / int型の 日付 / *後にのみ、と- * / int型 のテキストは、それを割り当てること知っている [21]を どのように/なるpiladorは*。 ; /* Tente um sizeof(my_type) no main. * /)は、/ *は、メイン(my_type)にはsizeofをお試しください。 create_my_type ( my_type ** my_ptr ) { /* some code... * / ボイド create_my_type(my_type my_ptr **)(/ *いくつかのコードを... void destroy_my_type ( my_type ** my_ptr ) { /* some code... * /) ボイド destroy_my_type(my_type my_ptr **)(/ *いくつかのコードを... void set_data ( my_type * my_ptr , int d ) { /* some code... * /) ボイド set_data(my_typeの my_ptrの*は、int d)は (/ *いくつかのコード... int get_data ( my_type * my_ptr ) { /* some code... * /)Int の get_data(my_typeの my_ptrの*)(/ *いくつかのコードを... void set_text ( my_type * my_ptr , const char * text ) { /* some code... * /) ボイドセット_(my_typeの my_ptrの*、const char *をテキスト )(/ *いくつかのコードを... char * get_text ( my_type * my_ptr ) { /* some code... * /) シャア * get_text(my_type my_ptr *)を(/ *いくつかのコード... * /)
完全なソースコードの例は見つけることができますここ。
あなたが直接、私たちは"と"デストラクタ""ビルダを定義する必要がこの種の変数を作成することはできませんので。
メンバーに直接アクセスする試みは、コンパイルエラーを生成します:
private-struct-members$ gcc -o teste mytype.h mytype.c main.cユーザー@ホスト:〜/プライベート構造体会員$ のgcc - Oテストmain.cのmytype.h mytype.c main.cの:関数では'主: main.cの:22:エラー:デリファレンスポインタ型に不完全な private-struct-members$ユーザー@ホスト:〜/プライベート構造体会員ドル
したがって、少しの創造性と両方のパラダイムとしての言語の概念を取る場合は、本当に面白いコードを実装することができます。 この愚かな例では、カプセル化またはコンストラクタの使用Cで/デストラクタが、システムの状況は、C + +、または複雑さを許可していないのエミュレーションを強制の有用性をクリアしないかもしれないが、このような技術を重要なレベルに到達する傾向されます大きな価値のショー。 この例では、この手法は具体的に、誰がプロジェクト全体を逃した経験豊富なプログラマを許可、彼は構造体のメンバには、彼の試みに直接アクセスする発見、コンテンツ不適切だった。 それがなければ、バグカブールロジックが実行時にのみ、このソフトウェアは、おそらく顧客の顔に爆発意思表示される。
お役立ちリンク(またはしない...):
http://www.directfb.org
http://www.caloni.com.br
http://www.numaboa.com.br/informatica/c/
ペーパーLinuxカーネルの開発


