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

时间:2010-05-10 23:31:45

标签: c++ c struct

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

6 个答案:

答案 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)

您可以使用GCC和其他海报mentioned进行此操作,但除此之外,您还可以使用-fms-extensions标记,该标记允许您使用先前定义的struct作为未命名字段。< / p>

更多here

相关问题