1

structほとんどが共通のフィールドを持っているが、1つまたは2つの異なるフィールドまたはそれ以下のフィールドを持つ2つの異なるフィールドがあると仮定します。例えば:

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

2秒以上使用するためのより効率的でエレガントなコーディング方法はありますstructか?structフィールドの大部分を共有しているので、これは2つの異なるを使用するのは無駄ではないでしょうか。

アップデート

私の以前の質問は誤解を招くものでした。上記の例はノードであり、(によってlink)単独でリンクされています。

4

3 に答える 3

6

すべての追加フィールド(2番目の構造体には存在するが最初の構造体には存在しない)を構造体タイプ定義の最後に移動してから、小さい方の構造体を大きい方の構造体の「ベース」として使用できます。

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で検索してください)。

これを行うには、基本的に2つの方法があります。

  1. 基本クラスを宣言してから、継承クラス(より多くのフィールドがある)で、基本クラスをメンバーとして継承クラスの先頭に配置します。

    struct hobbyLink; //共通リンク

    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 に答える