我有两个非常大的结构。它们之间几乎没有共同的领域,但也有独特的领域。我想要做的是根据要复制的结构的特定条件将这些公共字段的内容复制到第三个结构。现在出现了主要问题。我不想写两个不同的复制功能。例如
struct test1 {
//Has many members
} TEST1_INFO;
TEST1_INFO *g_TEST1_ptr;
struct test2 {
//Has many members
} TEST2_INFO;
TEST2_INFO *g_TEST2_ptr;
struct destination_struct {
//Has many members
} DEST_INFO;
DEST_INFO *g_DEST_ptr;
从结构1或2复制内容的一种方法是编写两个不同的复制函数并调用所需的复制函数,这是我想要避免的。其他方法是将条件放在单个函数中,并复制两个结构中所需的内容,这是实现先前技术的另一种方式。
我想要的是这样的:
void * generic_pointer;
if(//mycondition)
generic_pointer = g_TEST1_ptr;
else
generic_pointer = g_TEST2_ptr;
g_DEST_ptr->member1 = generic_pointer->member1; ...
这可能吗???或者是否有一些替代解决方案,我想要实现的目标?请注意,这是ANSI-C ...
特有的编辑1: 好的,所以在探索可能的替代解决方案时,我遇到了这个我以前从未使用过的联盟,有人可以告诉我是否可以使用工会来解决我的问题?非常感谢任何帮助。
答案 0 :(得分:1)
您可以像这样重构您的结构:使用公共字段构建结构并将其用于您想要的2个结构。然后为不同的领域构建2个结构。这允许您编写更少的代码行进行传输。毕竟,你无法回避有关如何处理不同字段的问题。
struct common_tag { /* common fields */ };
struct flavor1_specifics_tag { /* fields, specific to flavor1 */ };
struct flavor2_specifics_tag { /* fields, specific to flavor2 */ };
struct flavor1_tag { struct common_tag common; struct flavor1_specifics_tag others; };
struct flavor2_tag { struct common_tag common; struct flavor2_specifics_tag others; };
有了这个,你可以以多态方式使用2个结构。至少要比特:
struct common_tag *flavor1_to_common( struct flavor1_tag * f1 );
struct common_tag *flavor2_to_common( struct flavor2_tag * f2 );
当你或其他人修改结构时,你也会避免令人讨厌的意外,而不知道你试图(ab)使用共性。通过这里显示的策略,你想要做的事情是相当明显的,未来的变化将不太可能被你可能采取的捷径所摧毁。
答案 1 :(得分:1)
不,你描述它的方式是不可能的。可以取消引用void指针的唯一方法是首先将其转换为另一种类型。
关于你如何做你想做的事情,这取决于你的意思"常见字段"。
如果您的意思是一组具有相同名称和相同类型的成员,则解决方案很简单。
struct CommonToBoth
{
/* list all the members in common to both your structs */
};
struct test1
{
struct CommonToBoth common;
/* other members specific to test1 here */
};
struct test2
{
struct CommonToBoth common;
/* other members specific to test2 here */
};
从那里,复制公共部分的方法很简单,如果你需要的只是一个浅拷贝(按值复制)。
struct test1 x;
struct test2 y;
/* initialise x */
y.common = x.common; /* this copies all the common parts by value */
这允许您根据需要将常用操作排除到函数中。如果您需要任何公共部分的深层复制(例如,一个成员是必须在复制时动态分配的指针),那么您将需要编写一个函数来复制公共部分,而不仅仅是按值复制。
如果需要,您还可以将特定于每个struct
类型的部分放入其他struct
类型中。这取决于您是否打算在其他struct
类型中重用这些部分。所以你可以做到
struct test1 x;
struct test2 y;
/* initialise */
x.common = y.common;
x.specific = some_other_x.specific;
y.specific = some_other_y.specific;
x.specific = y.specific; /* this will have a type mismatch, so compiler error */