1

私はC++とそのオブジェクト指向の性質を使ったプログラミングに精通しています。今、私は最近Cで働くことになっています。過去に準備したオブジェクト指向のヘッダーファイル(クラス、コンストラクター、デストラクタなどを使用)を引き続き使用したいと思います。これをしている間、私が隠された事実について知るのを手伝ってください。プログラムは構文エラーを与えませんが

4

5 に答える 5

4

オブジェクト指向プログラミングにはCを使用できます。私はこれをします。しかし、C言語は役に立ちません。

オブジェクト指向プログラミングにCを使用する方法について説明します。しかし、私が話しているのは実践についてであり、言語に組み込まれていることについてではないことを理解してください。

C ++では、を宣言でき、、、、およびパーツを含めるclassことができます。Cでは、を宣言でき、のすべてが公開されます。C ++では、に関連する関数を含めることができます。Cでは、関数はグローバルです。(Cでは、宣言された関数と変数は単一のソースファイルに対してプライベートですが、そのファイル内ではグローバルです。宣言されていない関数と変数はプログラム全体でグローバルです。aのメンバーをプライベートとして宣言する方法はありませんが、一部のメンバー変数がプライベートであることを意図していることを明確にする命名規則を自由に使用できます。)publicprivateprotectedstructstructclassstaticstaticstruct

C ++では、名前空間があり、classフォームが名前空間を形成します。Cでは、グローバル名前空間は1つだけです。

C ++では、演算子のオーバーロードがあります。Cではありません。

C ++では、関数をメンバー関数として宣言すると、コンパイラーは魔法のようにthisポインターを使用可能にします。Cでは、メンバー関数を作成できますが、thisポインターと同等の引数を明示的に指定する必要があります。

C ++では、コンパイラーがすべてのコンストラクターとデストラクタをアレンジします。Cでは、関数を明示的に呼び出す必要があります。

それでは、Cでオブジェクト指向プログラミングを行う方法は次のとおりです。

まず、オブジェクトにデータを保持する構造体を宣言します。参照しやすいように使用することをお勧めしtypedefます。あなたが自動車用の物理シミュレーターを書いていると想像してみましょう。typedef構造体がタイプとして編集されるとしましょうCAR

次に、コンストラクタとデストラクタ関数を記述します。~コンパイラはあなたを助けないので、それをする努力をする価値があります。したがって、デストラクタの名前にaを使用することはできません。あなたの関数がととして宣言されていると想像しCAR *PcarNew();ますvoid FreePcar(CAR *pcar);

次に、メンバー関数を記述します。車のエンジンを始動する機能は。かもしれませんvoid StartEnginePcar(CAR *pcar);。(トラックもある場合は、void StartEnginePtruck(TRUCK *ptruck);;バスもある場合は、 void StartEnginePbus(BUS *pbus);;などがあります。グローバル名前空間は1つだけです。)thisポインターがないため、最初の引数はインスタンスへの明示的な参照です。クラスの(つまり、コンストラクターを呼び出すことによって割り当てられたポインター)。

cC ++では、のインスタンスであるという名前のオブジェクトを持つことがclass carでき、次のように言うことができることに注意してくださいc.start_engine()。C ++コンパイラは、あなたがstart_engine()からのメンバー関数を意味することを知っていますclass car。C ++には、同じ名前の関数をいくつでも持つことができ、それぞれが異なるクラスのメンバーであり、C++は名前空間を使用してそれらを追跡します。Cでは、そのようなものは得られず、すべての関数名は一意である必要があります。これが、Cオブジェクト指向プログラミングの関数名が通常のように関数名自体に「クラス」の名前を持っている理由ですStartEnginePcar()。(一部の人はおそらく使用するでしょうが、私は最初の例で使用したスタイルを奨励する特定のコーディングスタイルを使用しStartEngineCar()ますCarStartEngine()。もちろん、好きなコーディングスタイルを使用してください。)

(以下のコメントに記載されているように、Cでは関数ポインターを構造体の中に入れて->演算子で呼び出すことができますが、これは関数が何であるかを事前に知らない場合に最適です。オブジェクト指向の構文を複製しますvirtual。C++でポインターのようなことをする必要がある場合は、「クラス」で関数ポインターを使用しますstruct。)

オブジェクト指向プログラミングは、CではC ++ほど優れていませんが、CでOOPモデルに明示的に従うことで、プログラムの設計と理解が容易になると思います。

于 2012-06-11T06:03:33.053 に答える
3

Cはオブジェクト指向言語ではありません。

Cは、命令型手続き型)システム実装言語です。

gccコンパイラを使用していると仮定して、次のオプションを使用してコンパイルしてみてください。

gcc -std=c99 replacewithyoursourcefilename.c -o execProgram

そして、コンパイラエラーが表示されます。

C ++コードを純粋なCに書き直すオプションはありますか?

言語の詳細については、StackOverflowのCタグを確認することをお勧めします。

それが役に立てば幸い!

于 2012-06-11T05:23:15.780 に答える
1

いいえ!C標準はC++標準よりも前に作成されたため、すべての新しい構造ではCで構文エラーが発生します。C++関連のものを次のようにカプセル化できます。

#ifdef __cplusplus 
..
#endif

互換性の問題に対処するのに役立つ場合は、Cコンパイラからそれらを非表示にします。

于 2012-06-11T05:25:22.317 に答える
1

オブジェクト指向(クラス、コンストラクタ、デストラクタなどを使用)である過去に準備したヘッダーファイルを引き続き使用したい

したがって、ヘッダーファイルはC ++で記述され、クラスを使用します。これは、Cでは使用できないC ++のみの構文です。したがって、答えは「いいえ、CではC++クラスを使用できません」です。

あなたにできることはどちらかです

  • C ++コードをライブラリにカプセル化して、Cで記述されたAPIでラップしてみてください。これは、使用しているプラ​​ットフォームでC ++コンパイラが利用できる場合にのみ機能しますが、そうではないと思います(他にわざわざ悩むのはなぜですか)。その場合はC?)
  • C言語要素を使用してオブジェクト指向スタイルを維持しながら、C++クラスをCで書き直します。これは、Cを使用してオブジェクト指向プログラミングを行う方法に関する完全なオンラインブックです。
于 2012-06-11T05:49:35.240 に答える
0

StackOverflowで「mixcandc ++」を検索して、解決策を見つけることができます。

于 2012-06-11T07:05:42.613 に答える