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;

我想要做的是StructA通过访问字段StructB而不访问 StructB 上的数据字段。类似于类之间的继承。像这样:

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

我想StructA继承StructB. 我知道我可以用类来做到这一点,但由于某些原因(互操作、堆栈的特定使用等),我必须使用 struct。

谢谢你的时间!

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 - 使用宏定义这些字段。然后你可以在两个结构中使用它们

#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在此处提及任何地方:代码有效,因为“基本”字段实际上是“派生”结构的第一个成员。因此,类型的值struct StructB *可以用于通过struct StructA *. 这就是接口重用:用于访问的同一组函数StructA可用于访问StructB.

于 2012-08-15T20:00:29.273 回答