谈论结构,是否可以将struct
的字段复制到另一个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(互操作,堆栈的具体使用等)。
谢谢你的时间!
答案 0 :(得分:5)
您可以使用继承在C ++中执行此操作:
struct StructB: public StructA
{
int SomeOtherDeclarations;
// ...
};
鉴于此,您可以执行
StructB strB;
strB.Name[0] = 0;
答案 1 :(得分:1)
在简单的C中,我有两个选择:
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;
在这种情况下,StructA
和StructB
之间没有任何关联。但是你有相同的领域。这至少为您提供了一些模块化。像这样的宏通常用于实现/伪造新语言给你的东西(例如继承或通用性)。
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;
}
答案 2 :(得分: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'字段实际上是'derived'结构的第一个成员。因此,struct StructB *
类型的值可以在您通过struct StructA *
访问字段的位置使用。这是接口重用:用于访问StructA
的同一组函数可用于访问StructB
中的相同字段。
答案 3 :(得分:0)
如果您使用的是gcc,请尝试将其设为匿名成员:
http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html
struct StructA
{
char Name[20];
int Age;
};
struct StructB
{
struct StructA;
int SomeOtherDeclarations;
// ...
};