我有2个结构,其90%的字段相同。我想在结构中对这些字段进行分组,但我不想使用点运算符来访问它们。原因是我已经使用第一个结构进行了编码,并且刚刚创建了第二个结构。
之前:
typedef struct{
int a;
int b;
int c;
object1 name;
} str1;
typedef struct{
int a;
int b;
int c;
object2 name;
} str2;
现在我要创建第三个结构:
typedef struct{
int a;
int b;
int c;
} str3;
并将str1和atr2更改为:
typedef struct{
str3 str;
object1 name;
} str1;
typedef struct {
str3 str;
object2 name;
} str2;
最后,我希望能够通过以下方式访问a,b和c:
str1 myStruct;
myStruct.a;
myStruct.b;
myStruct.c;
而不是:
myStruct.str.a;
myStruct.str.b;
myStruct.str.c;
有没有办法做这样的事情。这样做的原因是我希望保持数据的完整性,如果发生结构的chnges并且不重复自己而不必更改我现有的代码并且没有嵌套太深的字段。
已解决:你的所有答案都是。这样做的最终方式是我可以使用自动完成功能如下:
struct str11
{
int a;
int b;
int c;
};
typedef struct str22 : public str11
{
QString name;
}hi;
答案 0 :(得分:10)
是。而是使用C风格的继承,使用C ++风格:
struct str3{
int a;
int b;
int c;
};
struct str2 : public str3{
object2 name;
};
答案 1 :(得分:3)
第一句话。此
struct
{
int a;
int b;
int c;
} str3;
定义了一个对象str3,而不是一个str3类型。
你可以使用继承来实现你想要的东西,但我建议你改变你的结构数量
struct str1
{
int a;
int b;
int c;
};
struct str2 : public str1
{
object1 name;
};
答案 2 :(得分:2)
执行此操作的原因是,如果要发生结构的chnge,我希望保持数据的完整性
为了实现这一点,我宁愿使用适当的封装,访问器和继承来使用户代码中的布局更改不可见:
class DataHolder {
int a_, b_, c_;
public:
int a() const { return a_; }
int b() const { return b_; }
int c() const { return c_; }
};
class User : public DataHolder {
object o_;
public:
object& getObject() { return o_; }
};
答案 3 :(得分:1)
我不确定C ++(我还在学习C ++),但在C语言中,有些编译器允许使用匿名结构。使用GCC 4.3时,如果未指定任何标志,则以下编译没有错误,但无法使用-ansi
或-std=c99
进行编译。然而,它与-std=c++98
成功编译:
int main (int argc, char *argv[])
{
struct
{
struct
{
int a;
int b;
int c;
};
int test;
} global;
global.a = 1;
global.b = 2;
global.c = 3;
global.test = 4;
return global.b;
}
答案 4 :(得分:0)
不要使用愚蠢的技巧来避免适当的重构。它可以节省你一点点打字,但它会咬你的...后来。如果编辑很复杂,那么你使用的是错误的工具和/或你的命名方案不好(1个字母的名字很难找到/替换)。
答案 5 :(得分:0)