代码之家  ›  专栏  ›  技术社区  ›  yan bellavance

我可以在不使用点运算符的情况下访问结构内部的结构吗?

  •  3
  • yan bellavance  · 技术社区  · 16 年前

    我有两个结构,它们90%的场是一样的。我想将这些字段分组到一个结构中,但不想使用点运算符来访问它们。原因是我已经用第一个结构进行了编码,并且刚刚创建了第二个结构。

    前:

    typedef结构{
    国际会计准则;
    国际标准B;
    国际会计准则;
    对象名称;
    STR1;
    
    TyBuffsStult{
    国际会计准则;
    国际标准B;
    国际会计准则;
    对象名称;
    2.STR2;
    < /代码> 
    
    

    现在我将创建第三个结构:

    typedef结构{
    国际会计准则;
    国际标准B;
    国际会计准则;
    3.STR3;
    < /代码> 
    
    

    将str1和atr2改为:

    typedef结构{
    STR3 STR;
    对象名称;
    STR1;
    
    typedef结构{
    STR3 STR;
    对象名称;
    2.STR2;
    < /代码> 
    
    

    最后,我想通过以下操作访问A、B和C:

    str1 mystruct;
    MySt.
    MyStult.B;
    MyStult.C;
    < /代码> 
    
    

    而不是:

    mystruct.str.a;
    MyStult.S.B;
    MyStult
    < /代码> 
    
    

    有没有办法做这种事?这样做的原因是,如果要对结构进行更改,并且不重复自己的操作,也不必更改现有代码,也不必将字段嵌套得太深,那么我希望保持数据的完整性。

    解决:所有答案都是THX。为了使用自动完成,最后一种方法是:

    <代码> 结构str11
    {BR/> a;br/> INBR/
    IN/BR> };
    typedef str22:public str11
    {BR/> qstring name;
    嗨,
    < /代码>

    之前:

    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。为了使用自动完成,最后一种方法是:

    结构STR11
    {
    国际会计准则;
    国际标准B;
    国际会计准则;
    };
    typedef结构str22:公共str11
    {
    字符串名称;
    嗨!

    6 回复  |  直到 16 年前
        1
  •  10
  •   Nathan Ernst    16 年前

    对。而是使用C风格继承,使用C++风格:

    struct str3{
      int a;
      int b;
      int c;
    };
    
    struct str2 : public str3{
      object2 name;
    };
    
        2
  •  3
  •   Georg Fritzsche    16 年前

    第一句话。这个

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

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

    您可以使用继承实现您想要的,但我建议您更改结构的编号。

    struct str1
    {
      int a;
      int b;
      int c;
    };
    
    
    struct str2 : public str1
    {
      object1 name;
    };  
    
        3
  •  2
  •   Georg Fritzsche    16 年前

    这样做的原因是,如果要对结构进行更改,我希望保持数据的完整性。

    为了实现这一点,我宁愿使用适当的封装、访问器和继承来使布局中的更改在用户代码中不可见:

    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_; }
    };
    
        4
  •  1
  •   dreamlax    16 年前

    我不确定C++(我还在学习C++),但是在C语言中,一些编译器允许匿名结构。在GCC4.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;
    }
        5
  •  0
  •   Patrick Schlüter    16 年前

    不要使用愚蠢的技巧来避免正确的重构。它可以帮你节省一点打字的时间,但是它会咬你的A。后来。如果编辑很复杂,那么您使用了错误的工具和/或您的命名方案不正确(很难找到/替换1个字母的名称)。

        6
  •  0
  •   Community Mohan Dere    9 年前

    你可以用GCC来做,就像其他海报一样。 mentioned ,但除此之外,您还可以使用 -fms-extensions 允许您使用先前定义的标志 struct 作为未命名字段。

    更多 here .