相同的功能但不同的参数传递给功能

时间:2015-01-18 16:32:45

标签: c polymorphism function-pointers

struct student {

    char            *s_name;

    struct student_id   s_id;

    /** Number of references to this student. */
    unsigned int         s_ref;

    /** Transcript (singly-linked list, NULL terminator). */
    struct transcript_entry *s_transcript;

    /** Whether or not this student has completed his/her program. */
    student_complete     s_complete;
};

struct student* student_grad_create(const char *name, size_t namelen,
    struct student_id, int phd);

struct student* student_undergrad_create(const char *name, size_t namelen,
    struct student_id);

有三种学生,硕士生和博士生以及本科生。我需要实现一个叫做的功能:

int student_add_entry(struct student *, struct transcript_entry *);

我不知道如何确定学生类型?

我应该这样做吗?

int student_add_entry(struct student *undergrad_create, struct transcript_entry *){}
int student_add_entry(struct student *grad_create, struct transcript_entry *){}

感谢。

2 个答案:

答案 0 :(得分:2)

您可以在结构

中添加student_type字段
struct student {
    char                    *s_name;
    struct student_id        s_id;
    /** Number of references to this student. */
    unsigned int             s_ref;
    /** Transcript (singly-linked list, NULL terminator). */
    struct transcript_entry *s_transcript;
    /** Whether or not this student has completed his/her program. */
    student_complete         s_complete;
    enum student_type        s_type;
};

你会有enum喜欢

enum student_type
{
    UndergraduateStudent,
    MasterStudent,
    PHDStudent
};

在创建struct student的实例时,您需要设置s_type字段,然后在其他地方使用s_type来确定学生的类型。

我还会编写一个通用函数来创建struct student的所有可能参数的实例,如果你想要方便,你也可以为每个特定类型创建一个函数,你可以在其中传递默认参数通用功能。

答案 1 :(得分:0)

我正在研究一些学生注册系统问题。 1.有三种不同的学生类型 2.本科生通过考试50分,硕士和博士通过65分 3.本科生必须完成40门课程,硕士生5人,博士生2人。

这是我需要实现的三个功能。 “ 下面是transcript_entry的结构:

struct transcript_entry {
    enum faculty         te_faculty;
    unsigned int         te_number;
    unsigned int         te_grade;
    /** Number of references to this entry. */
    unsigned int         te_ref;
    /** Next entry in the singly-linked list (or NULL terminator). */
    struct transcript_entry *te_next;
};

我实现了以下功能:

struct transcript_entry* transcript_entry(enum faculty faculty, unsigned int course_number, unsigned int grade){
    struct transcript_entry *trans_entry;
    trans_entry = malloc(sizeof(struct transcript_entry));
    trans_entry->te_faculty = faculty;
    trans_entry->te_number = course_number;
    trans_entry->te_grade = grade;
    trans_entry->te_ref = 1;
    trans_entry->te_next = NULL;
    return trans_entry;
}

/** Deallocate a @ref transcript_entry. */
void    transcript_entry_free(struct transcript_entry *trans_entry){
    free(trans_entry);
}

/** Increment a @ref transcript_entry's refcount. */
void    tehold(struct transcript_entry *trans_entry){
    trans_entry-> te_ref++;
}

我看了一些关于引用计数的教程。我不知道我的代码是否有意义。因此,这意味着增加引用计数++,或减少te_ref - ;