26

さて、あなたは私を初心者と呼ぶかもしれませんが、私は本当に混乱しています。

私の元クラスメートは私にCでプログラムを書くためにお金を払ってくれました。彼女は私に仕事を与えてくれました。 。

そして、私は彼女に「これはCではなくC ++です」と言いました。彼女は「しかし、私たちはCを学んでいます」と言いました。

私はそれを無視してc++でプログラムを書き、彼女が何について話しているのかわからないと思ったので彼女に送りました。彼女は「コードブロックでは機能せず、wtfはcout <<」と言った後、彼らが書いたコードのチャンクを送ってくれました。coutとcinの代わりにprintfとscanfがありました。それはCでなければなりませんでした。それで、私はprintfとscanfでプログラムを書き直しましたが、彼女はまだコードブロックがエラーをスローすると言います(私はまだタスクの要求に応じてクラスを残しました)。

wtfに聞きたいですか?Cにはクラスがありますか?それとも誤解か何かがありますか?

編集:私は何年も後に質問に戻ってきましたが、質問から99%のテキストを削除するのに時間がかかることに気づきました。人生を手に入れてください、これはまだ1984年ではありません。

4

8 に答える 8

22

いいえ、Cにはクラスがありません。とは言うものの、Cでオブジェクト指向プログラミングをシミュレートする方法があります-グーグルですばやく検索すると、いくつかの有用な結果が得られるはずです。

于 2012-04-25T12:43:11.077 に答える
19

いいえ、Cにはクラス自体はなく、C ++(当時は「Cwithclasses」として始まった...)のみがあります。ただし、標準CライブラリをC ++コードで使用することはできますが、それが良い習慣とは見なされないことがよくあります(C ++には独自の高レベルの構造があります(例:coutvs printf))。

Cでもクラス、継承、仮想関数の動作をエミュレートすることができますが、苦労する価値はありません。

あなたはおそらくあなたの元クラスメートにCプログラミングの本を買う/手に入れるべきです:-)

于 2012-04-25T12:41:51.793 に答える
4

Cにはクラスの正式な構成がありません。モジュールレベルのデータを使用してモジュールを作成できます。モジュールレベルのデータは、他の場所では外部化されません。静的データは、そのデータを取得、設定、または操作するための関数を記述します。関数ポインタを使用して、クラス内にあるかのように同様のデータ型を操作することもできます。

ただし、Cコンパイラはクラスを認識していないため、Cコンパイラによるクラスセマンティクスやその他のルールによって保護されることはありません。ただし、データの構造化は非常に強力です。

于 2012-04-25T12:44:35.877 に答える
3

Cにはクラスがありません。

ただし、静的グローバルをプライベートクラスメンバーとして使用し、静的関数をプライベートメンバー関数として使用することで、クラスを近似できます。パブリックとしての外部メンバー。この場合、ファイル全体をクラスとして表示できます。

おそらくこれはあなたが望むものではありません。

于 2012-04-25T12:41:41.637 に答える
2

矛盾する要件の典型的なケース、それはそうです:-)

彼女の要件の用語CLASS、CONSTRUCTOR、METHODはすべてC ++の用語ですが、Cの用語ではありません(最も近いのはおそらくSTRUCT、INITIALIZATION、FUNCTIONです)。あなたの友人ここで何かを混乱させています。彼女の先生が何かを混乱させているとは思えませんが...

于 2012-04-25T12:53:46.190 に答える
2

Cにはクラスがありませんが、構造体と関数へのポインターを使用してエミュレートできます。C99はC++に少し(少しだけ)基づいているので、Cでクラスを再現するのは簡単です。

于 2012-04-25T13:34:21.923 に答える
2

Cはクラスをサポートしていませんが、トリッキーなハッキーな回避策があります。説明全体を読むか、コードセクションまでスクロールダウンしてください。

構造体宣言:

struct名前クラスでを宣言しました。内部に、初期化されていないfunctionタイプをvoid、name Print、および1つのパラメーターcharを入れます。これは次のようになりますvoid class.Print(char);

構造体は内部で初期化を許可しません:

ただし、structでは内部の変数の初期化は許可されていません。だから私たちはそれを外で初期化します。クラスfunctionのタイプがPrinterという名前のaを作成しました。それを初期化し、簡単に利用できる初期化された構造体を返します。struct

クラスを呼び出す:

classこれで、ヘルパーヘッダーと、型、名前printer1、値を持つ宣言された変数が含まれPrinter()ました。クラスのメンバーに電話して、を使用して文字列を出力した後printer1.Print("Hello from class function");

main.c

#include "helper.h"
void main()
{
    class printer1 = Printer();
    printer1.Print("Hello from class function");
}

helper.h

#include <stdio.h> //imports int printf(...);
void print(const char* text)
{
    printf(text);
}

typedef struct 
{
    void (*Print) (const char*);
} class;

class Printer()
{
    class Printer;
    Printer.Print = &print;
    return Printer;
}

ノート:

  • この正確な例は、VCおよびtccコンパイラで正常にコンパイルおよびテストされました。
  • class名前の例です。他の名前も使用できます。
于 2021-08-13T09:59:24.333 に答える
0

Cは、クラスを使用するC ++、Java、Pythonなどの言語のようにオブジェクト指向プログラミングを実装する代わりに、主に機能/構造プログラミングを使用します。ただし、次のようなクラスを使用する場合はほとんどありません。

typedef struct {
    ShapeClass shape;
    float width, height;
}
RectangleClass;

お役に立てば幸いです。

于 2021-06-18T08:26:27.807 に答える