1

Cプログラミングクラスで、プログラムをよりオブジェクト指向にするように変更する割り当てが与えられました。これの一部は、toStringメソッドを修正することでした。道順は次のとおりです。

 Modify the Student module to make it more object-oriented.

* Each Student object should have a function pointer that points to an 
  appropriate function for producing a string representation of the object.
* Provide a default toString method to each object when it is created. 
  The studentToString method should no longer be part of the Student interface 
  (as defined in Student.h)

しかし、これが何を意味するのかはよくわかりません。私たちがやろうとしていることについて、正しい方向に進んでいるかどうかを知りたいと思います。Student.cファイルのコードは次のとおりです。

 #include <stdio.h>
 #include <stdlib.h>
 #include "Student.h"
 #include "String.h"

 static void error(char *s) {
     fprintf(stderr, "%s:%d %s\n", __FILE__, __LINE__, s);
     exit(1);
 }

 extern Student newStudent(char *name, int age, char *major) {
     Student s;
     if (!(s = (Student) malloc(sizeof(*s))))
         error("out of memory");
     s->name = name;
     s->age = age;
     s->major = major;
     return s;
 }

 extern char *studentToString(Student s) {
     const int size = 3;
     char age[size + 1];
     snprintf(age, size, "%d", s->age);

     char *line = newString();
     line = catString(line, "<");
     line = catString(line, s->name);
     line = catString(line, " ");
     line = catString(line, age);
     line = catString(line, " ");
     line = catString(line, s->major);
     line = catString(line, ">");
     return line;
 }

*studentToStringメソッドが*toStringメソッドに置き換えられることはわかっていて、*toStringメソッドの内容は*studentToStringメソッドと同じであると考えています。しかし、それがどのようにオブジェクト指向になるのかはわかりません。また、指示から、新しいStudentオブジェクトを作成するときに、新しいtoStringメソッドを指すポインターをnewStudentメソッドに含める必要があることも決定しました。

私たちは私たちのためにプログラムを行う人を探していません。私たちの教授が一週間町を離れていたので、私たちは私たちが何をすべきかを理解したいだけです。どんな助けでも大歓迎です。

4

3 に答える 3

0

Student構造体を取得し、構造体自体の内部にある関数へのポインターを追加して、Student構造体への有効なポインターがある場合に、次のような操作を実行できるようにするように求められているようです。

`myStudent->toString();`

と同じ値を返すようにします

`studentToString(myStudent)`

以前持っていたでしょう。これによりtoString、構造の効果的な「インスタンス」(より適切な用語がないため)でメソッドを呼び出し、Studentその「インスタンス」に関連するパラメーターを返すため、よりオブジェクト指向になります。ある種のオブジェクトベースのプログラミング言語と同じように。

于 2011-04-08T22:10:23.010 に答える
0

私の推測では、Student構造体にメンバーを追加する必要があります。そのメンバーのタイプは、関数ポインターになります。

次に、その関数を定義します。

次に、関数ポインタを使用してnewStudentへのパラメータを追加します。

次に、新しく作成されたメンバーをパラメーターの値に設定します。

(これはOOを学ぶための非常に抽象的な方法のように感じますが、それは私の意見です)

于 2011-04-08T22:10:51.033 に答える
0

あなたの教授があなたにこの問題を設定したように見えるので、あなたはポリモーフィズムを理解することができます。この例では、システム内のすべてのオブジェクトがそれ自体を文字列としてレンダリングする独自の方法を持っている必要がありますが、詳細は知りたくないという考え方です。toString任意のオブジェクトを呼び出せるようにしたいだけです。

例えば

banana->toString()
apple->toString()
于 2011-04-08T22:16:36.870 に答える