2010-05-10 34 views
3

我有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; 

有没有办法做这样的事情。这样做的原因是我想保持数据的完整性,如果发生结构变化,不要重复自己,也不必更改我现有的代码,也没有嵌套太深的字段。

已解决:thx为你所有的答案。的做,这样我可以使用自动完成最后的办法也是以下:

struct str11
{
int a;
int b;
int c;
};
typedef struct str22 : public str11
{
QString name;
}hi;

+3

你的代码对我来说毫无意义。 'str3'不是一个类型,它是一个对象。 'str3 str'这个声明是没有意义的。当你声明结构时,说'struct str3 {...};'而不是'struct {...} str3;' – wilhelmtell 2010-05-10 23:40:25

+1

这就是为什么你没有找到答案,但其他人做的。 – 2010-05-11 00:12:15

+0

来自wikipedia:typedef是C和C++编程语言中的关键字。 typedef的目的是为现有类型分配替代名称。 从我:我想这毕竟是一种类型,取决于情况。 – 2010-05-11 00:24:44

回答

10

是。而是使用继承的C-风格,采用C++风格:

struct str3{ 
    int a; 
    int b; 
    int c; 
}; 

struct str2 : public str3{ 
    object2 name; 
}; 
+0

哦,当然,thx。 – 2010-05-10 23:40:32

+0

它的工作原理,但现在如果我使用自动完成功能,Qt不会向我建议这些字段,也许如果我重新启动qt或从头开始重建或... – 2010-05-10 23:49:58

+0

我在您的文章中没有看到有关Qt的任何信息。 – GManNickG 2010-05-10 23:57:31

2

之所以这样做,这是我要保持数据的integrety如果chnges到结构都发生

为了实现这个目标我宁愿使用适当的封装,存取和继承,以使布局的变化从用户代码中不可见:

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_; } 
}; 
+0

@Downvoter:谨慎解释? – 2010-05-11 00:39:55

+0

你的名字,它更长! – GManNickG 2010-05-11 07:19:31

+0

@G Man:呃,它一定是长了一夜 - 但我现在甚至得到'@'通知;) – 2010-05-11 12:16:09

3

第一个的话。 This

struct 
{ 
    int a; 
    int b; 
    int c; 
} str3; 

定义了一个对象str3,而不是一个str3类型。

你可以实现你想要使用继承,但我建议改变你的结构的数量

struct str1 
{ 
    int a; 
    int b; 
    int c; 
}; 


struct str2 : public str1 
{ 
    object1 name; 
}; 
+0

只是再次跟进 - 这里创建的类型的名称是什么?这不是'str3',因为你似乎认为你的帖子。 – 2010-05-11 00:34:33

+0

@Yan:不,你不能这样做。您的示例创建* unnamed类*的*实例*。 – 2010-05-11 00:51:19

+0

http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx – 2010-05-11 02:19:33

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; 
}
+0

这将工作,如果我不需要在另一个重用结构 – 2010-05-11 00:30:06

0

不要使用愚蠢的技巧,以避免适当的重构。它可以节省你一些打字的时间,但它会在你稍后的时间内咬人。如果编辑起来很复杂,那么你是在使用错误的工具和/或你有一个错误的命名方案(1个字母的名字很难找到/替换)。

0

你可以用GCC做到这一点,因为其他海报mentioned,但除了这一点,你可以使用-fms-extensions标志,使您可以使用前面定义struct为未命名字段。

更多here

相关问题