1

構造体について言えば、型フィールド名を明示的に呼び出さずに、 astructのフィールドを別のフィールドにコピーすることは可能ですか?struct

例を示しましょう。

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int SomeOtherDeclarations;
   // ...
};

したがって、これを行うとStructAフィールドにアクセスできます。StructB

StructB strB;
strB.FieldStructA.Name[0] = 0;

私がやりたいのは、StructB のデータ フィールドにアクセスせずにStructAフィールドにアクセスすることです。StructBクラス間の継承のようなもの。このような:

StructB strB;
strB.Name[0] = 0;

StructAのフィールドを継承したいStructB。クラスでそれを行うことができることは知っていますが、いくつかの理由 (相互運用、スタックの特定の使用など) で構造体を使用する必要があります。

御時間ありがとうございます!

4

4 に答える 4

5

継承を使用して C++ でこれを行うことができます。

struct StructB: public StructA
{
   int SomeOtherDeclarations;
   // ...
};

それを考えると、次のことができます

StructB strB;
strB.Name[0] = 0;
于 2012-08-15T19:49:33.470 に答える
1

私が見ているように、プレーンCでは、2つの選択肢があります。

1 - これらのフィールドをマクロで定義します。次に、それらを2つの構造体で使用できます

#define PERSON_FIELDS \
char Name[20]; \
int Age; \

struct StructA
{
STRUCT_A_FIELDS
};

struct StructB
{
   STRUCT_A_FIELDS

   int thing;
   // ...
};

そして、あなたはそれを使用することができます

StructB strB;
strB.Name[0] = 0;


StructA strA;
strA.Name[0] = 0;

この場合、StructAStructBは互いに接続しません。しかし、あなたは同じフィールドを持っています。これにより、少なくとも少しのモジュール化が可能になります。このようなマクロは、新しい言語が提供するもの (継承や汎用性など) を実現/偽造するためによく使用されます。

2 -または、上記のコードをそのままにして、アクセサー関数を使用して値を取得することもできます。

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int thing;
   // ...
};


int StructB_Thing(struct Struct *obj)
{
    return obj->thing;
}

int StructB_Age(struct Struct *obj)
{
    return obj->FieldStructA.Age;
}
于 2012-08-15T19:46:12.243 に答える
1

gcc を使用している場合は、匿名メンバーにしてみてください。

http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

struct StructA
{
  char Name[20];
  int Age;
};

struct StructB
{
   struct StructA;

   int SomeOtherDeclarations;
   // ...
};
于 2012-08-15T20:04:02.503 に答える
0

C ++では、継承は実装の再利用ではなく、インターフェイスの再利用に使用されます。後者のCは簡単に入手できますが、前者はちょっとしたトリックに注意する必要があります。

struct StructA
{
   char Name[20];
   int Age;
};

struct StructB
{
   StructA FieldStructA;

   int SomeOtherDeclarations;
   // ...
};

秘訣はあなたができることを理解することです

void setAge( struct StructA *s, int age ) {
    s->Age = age;
}

struct StructB b;
setAge( (struct StructA *)&b, 33 );
/* b.FieldStructA.Age is now 33 */

ここで言及する必要がないことに注意してくださいFieldStructA。「base」フィールドは実際には「派生」構造体の最初のメンバーであるため、コードは機能します。したがって、typeの値は、struct StructB *を介してフィールドにアクセスする場所で使用できますstruct StructA *。これはインターフェイスの再利用です。アクセスに使用されるのと同じ関数のセットを使用StructAして、の同じフィールドにアクセスできますStructB

于 2012-08-15T20:00:29.273 に答える