つまり、私が理解しているように、「オブジェクト」は基本的に値とメソッドの単なるラッパーです。sを使用してCで同じ機能を使用することはできませんstruct
か?Astruct
は単純なように見えますclass
が、もちろん、メソッドはありません。ここで私の問題の核心にたどり着きます。なぜメソッドが必要なのかまったくわかりません。?のインスタンスへのポインタを受け入れるだけの外部関数があれば、より単純でメモリ効率が高くなるのではないstruct
でしょうか。または、struct
sにこれらの関数へのポインタを持たせることもできますが、これは純粋に美的であるように思われます...
4 に答える
オブジェクト指向であることは、箱から出してオブジェクト指向であることを意味します。確かに、C(および他の多くの非オブジェクト指向言語)でオブジェクト指向をシミュレートできますが、言語(および/またはその標準ライブラリ)がそれをまったく役に立たない場合(特別な構文、標準オブジェクトなど)、デフォルトではOOスタイルでの記述は推奨されていません。オブジェクト指向とは呼ばれません。
構造体メンバーとしてCスタイルの関数ポインターを使用すると、実際にCオブジェクト指向にすることができます。
属性とメソッドがすべて一緒に定義されたクラスを持つという概念が好きです。あなたが言及したように構造体へのポインタを受け取る別個の関数を持っているのとは対照的に、関連するエンティティが何であるかを確認する方が簡単です。
関連する2つのSOの質問は次のとおりです。
11インチMacBookAirの画面に収まるANSICの戦略(またはその他の)デザインパターンをコーディングする簡単な方法はありますか?
あなたが提案することは、CでOO機能を実装するためにすでに使用されています。しかし、多くの人々は、OO機能が含まれている専用言語を使用する方が簡単だと感じています。
これは、人々が組み立てからCに切り替えた理由と同じ傾向です。
オブジェクトは実世界のエンティティであり、状態、動作があります。class(c ++ / java)では、状態をメンバー変数として定義し、関数を動作として定義できます。C:の場合、構造体では、状態はあるが動作はない場合があります。したがって、Cはオブジェクト指向ではありません。これはほんの小さな例です。たとえば、Cは、継承、関数のオーバーロード、ポリモーフィズムなどのOOPSプリンシパルをサポートしていません。