-2

だから私はCを学ぼうとしています.Cにはクラスがないことを理解しています. ただし、私は C++ プログラミングしか行っておらず、特別なタイプのオブジェクト、たとえば車を作成するには、そのクラスを作成する必要があります。このようなもの:

class Car {
     //code
};

void main() {
    Car c; //or Car c = new c(//constructor);
}

しかし、このようなときに C がクラスを持てない理由がわかりません。type の変数を宣言していますFILE。つまり、ファイルFILE内に構造体があるということですか? stdio.hデータ型は C で正確にどのように機能しますか?

4

3 に答える 3

2

しかし、Cがクラスを持てない理由がわかりません

厳密にはオブジェクト指向言語ではないからです。

それは、FILE が stdio.h ファイルの構造体であることを意味しますか?

はい。

データ型は C で正確にどのように機能しますか?

このトピックに関する論文全体があります (Google、最初のヒット)。

補足:構造体を使用して C でオブジェクト指向プログラミング スタイルをエミュレートすることができます。何かを OO と呼ぶかどうかは単なる観点の問題です。たとえば、悪名高い libcurl ネットワーク ライブラリの使用法を考えてみましょう。

CURL *hndl = curl_easy_init();
curl_easy_setopt(hndl, CURLOPT_URL, "http://example.com");
curl_easy_perform(hndl);
curl_easy_cleanup(hndl);

これは基本的に、次のような OOP コードを冗長に (明示的に) 記述したものです。

CURL hndl;
hndl->url = "http://example.com";
hndl->perform();

このトピックに関する論文もあります。

于 2012-11-14T19:16:33.950 に答える
0

C の同等物は、Carの属性の構造体型を定義してから、型 のオブジェクトを操作する関数を定義することですCar。それは基本的にFILEタイプがどのように機能するかです:

FILE *f = fopen("afile.txt", "r"); // open a file for reading
fgets(buffer, sizeof buffer, f);   // read from a file
fprintf(f, "%d on the wall", bottles--); // write formatted text to the file

タイプのオブジェクトをFILE直接操作することは決してありません。パス ポインターを前後に渡すだけです。

アクセス制御はありません。publicC 構造体の一部とその他の部分を作成することはできませんprivate。次のように実装を非表示にできます。

/** Car.h */
...
struct Car; 

struct Car *createCar(void);
void deleteCar(struct Car **theCar);
int startCar(struct Car *theCar);
...

/** Car.c */

#include "Car.h"
...
struct Car {
   char *make;
   char *model;
   int  year;
   ...
};

struct Car *createCar(void)
{
  struct Car *p = malloc(sizeof *p);
  if (p)
  {
    ... // initialize attributes
  }
  return p;
}

void deleteCar(struct Car **theCar)
{
  free(*theCar);
  *theCar = NULL;
}

void startCar(struct Car *theCar)
{
  theCar->running = 1; 
}

/** main.c */
#include "Car.h"
...
int main(void)
{
  struct Car *c = createCar();
  startCar(c);
  ...
  deleteCar(&c);
}

この例では、 ;main.cの前方宣言のみが表示struct Car;されます。Car.h型が不完全であるため、 typeへのポインターmainのみを宣言できます。では、構造体型は の定義で完成されるため、 内の関数はそれらのメンバーにアクセスできます。 struct CarCar.cstruct Car {char *make; char *model; ...};Car.c

于 2012-11-14T21:44:48.870 に答える
0

typedefキーワードを使用して、C で型を作成できます。私は通常、次のようなことを行います。

struct car_st {
    int numberOfSeats;
};
typedef struct car_st CAR;
typedef struct car_st * CAR_PTR;  

そんな感じ。

実際、C はクラスを持つことができます。C++ と Objective C の初期の実装は、プリプロセッサを使用して行われたと思います。問題は、真のデータ隠蔽とメソッドが得られないことです。メソッドに関数ポインターを使用することになります。これは、メンテナンスの悪夢であり、設定するのに多くの作業が必要です。継承をどのように行うかはわかりませんが、おそらく他の構造体へのポインターが混乱するでしょう。

だから、ええ、あなたはそのようなものを一緒に叩くことができます. しかし、しないでください。

于 2012-11-14T19:21:23.147 に答える