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 对象时,我们应该在 newStudent 方法中有一个指针,该指针指向新的 toString 方法。

我们不是在寻找任何人为我们做这个项目。我们只是想了解我们应该做什么,因为我们的教授已经出城一周了。任何帮助将不胜感激。

4

3 回答 3

0

听起来他要求您采用 Student 结构并在结构本身内部添加一个指向函数的指针,这样当您有一个指向 Student 结构的有效指针时,您可以执行类似的操作

`myStudent->toString();`

并让它返回与

`studentToString(myStudent)`

以前会有的。这使得它更加面向对象,因为您在结构toString的有效“实例”(由于缺乏更好的术语)上调用方法Student并返回与该“实例”相关的参数。就像在某种基于对象的编程语言中一样。

于 2011-04-08T22:10:23.010 回答
0

我的猜测是您需要向 Student 结构添加一个成员,该成员的类型将是一个函数指针。

然后定义该函数。

然后添加一个参数,将函数指针指向 newStudent。

然后将该新创建的成员设置为参数的值。

(这感觉像是一种非常抽象的学习面向对象的方法,但这只是我的看法)

于 2011-04-08T22:10:51.033 回答
0

看起来您的教授给您设置了这个问题,以便您了解多态性。在这个例子中,想法是系统中的每个对象都应该有自己的方式将自己呈现为字符串,但您不想知道细节;您只想能够调用toString任何对象。

例如

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