1

假设我们有两个不同struct的,它们大多具有共同的字段,但有一个或两个不同的字段或更少的字段。例如:

typedef struct HobbyNodetag {
    char *name; // hobby name
    struct HobbyNodetag* link; // link to next HobbyNode
    int count; // number of times this hobby was mentioned by user
    // more fields... 
    // but identical type/variable name with MyHobbyList
} HobbyNode; // database of entire hobby node; singly linked list

typedef struct MyHobbyTag{
    char *name; // hobby name
    struct MyHobbyTag* link; // linked to next MyHobbyNode
    // more fields... 
    // but identical type/variable name with EntireHobbyList
} MyHobbyNode; // single person's hobby node; singly linked list

我们是否有更高效/优雅struct的编码实践来使用以上两个?struct拥有两个不同的 s 因为它们共享大部分字段,这难道不是一种浪费吗?

更新

我之前的问题具有误导性。上面的例子是节点和单独链接(by link)。

4

3 回答 3

6

您可以将所有额外字段(存在于第二个结构中但不在第一个结构中)移动到结构类型定义的末尾,然后使用较小的结构作为较大结构的“基础”:

struct BaseFoo {
    int count;
    char name[128];
    float value;
};

struct ExtendedFoo {
    struct BaseFoo base;
    struct ExtendedFoo *next;
};

这个解决方案的好处是你可以拥有“多态性”:因为 C 标准保证在内存中的第一个结构成员之前没有填充,这将工作得很好:

void print_name(struct BaseFoo *foo)
{
    printf("Count: %d\n", foo->count);
    printf("Name: %s\n", foo->name);
}

struct ExtendedFoo foo = { /* initialize it */ };
print_name((BaseFoo *)&foo);
于 2013-02-17T06:24:03.997 回答
1

你可以做这样的事情,但我相信这不是你所追求的。

typedef struct myHobbyTag{
    char *name;
    struct myHobbyTag* link; 

} MyHobbyList; 

typedef struct entireHobbytag {
    MyHobbyList commonPart;

    int count;
} EntireHobbyList; 
于 2013-02-17T06:21:10.437 回答
0

如果将所有公共字段移到顶部,则可以使用 C 中的 OOP 声明基类和继承类(在 StackOverflow 上搜索。)

基本上有两种方法可以做到这一点。

  1. 您声明一个基类,然后在继承类(具有更多字段)中,您将基类作为成员放在继承类的顶部。

    结构爱好链接;// 普通链接

    typedef struct baseHobbytag {
        char *name;
        struct hobbyLink* link;
    } BaseHobby; 
    
    typedef struct myHobbyTag{
        BaseHobby  hobby;
        int count;
        // more fields...
    } HobbyTag;
    
  2. 您对所有公共基成员使用#define,并将该#define 放入所有继承类中。

    #define BASEHOBBY_MEMBERS   \
    char *name;             \
    struct hobbyLink* link;
    
    // base class
    typedef struct baseHobbytag {
        BASEHOBBY_MEMBERS   
    } BaseHobby;
    
    // Inherit basehobby    
    typedef struct myHobbyTag{
        BASEHOBBY_MEMBERS   
        int count;
        // more fields...
    } HobbyTag;
    
于 2013-02-17T06:28:41.533 回答