C++ 我可以不使用点运算符访问结构内部的结构吗?

C++ 我可以不使用点运算符访问结构内部的结构吗?,c++,c,struct,C++,C,Struct,我有两个结构,其中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{

我有两个结构,其中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;
有没有办法做这样的事。这样做的原因是,如果要对结构进行更改,我希望保持数据的完整性,不重复我自己的操作,不必更改现有代码,也不需要将字段嵌套得太深

已解决:谢谢您的所有答案。最后一种使用自动完成的方法是:


结构str11
{
int a;
int b;
int c;
};
typedef结构str22:公共str11
{
QString名称;
}嗨

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

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

struct str2 : public str3{
  object2 name;
};
这样做的原因是,如果要对结构进行更改,我希望保持数据的完整性

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

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_; }
};
第一句话。这个

struct
{
  int a;
  int b;
  int c;
} str3;
定义对象str3,而不是类型str3

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

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


struct str2 : public str1
{
  object1 name;
};  
<>我不确定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;
}

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

你可以使用GCC,就像其他海报一样,但除此之外,您还可以使用
-fms extensions
标志,该标志允许您将早期定义的
struct
用作未命名字段


更多。

你的代码对我来说毫无意义<代码>str3
不是类型,而是对象。语句
str3 str
毫无意义。当你声明结构时,比如说
structstr3{…}和非
结构{…}str3这就是为什么你找不到答案,但其他人都这么做的原因。维基百科:TyPulf是C语言和C++编程语言中的关键字。typedef的目的是为现有类型指定替代名称。我想这毕竟是一种类型,这取决于姜黄的温度。你在哪里看到typedef?上面的代码创建了两个匿名类型,并使变量str1和str2成为它们的实例(然后对str3再次执行相同的操作)。如果你想攻击一个评论者,至少你的事实是正确的。人们对你的话题的“攻击”是怎么回事@Wilhelm/dash/Maciejit可以工作,但是现在如果我使用自动完成功能,Qt不会向我建议这些字段,也许如果我重新启动Qt或者从头开始重建,或者……我在你的帖子中没有看到任何关于Qt的内容。我猜,在你的源代码至少被保存到最低限度之前,Qt不会重新生成它的自动完成信息。我不能肯定,因为我不使用Qt。(我还以为Qt是一个库集,不是IDE?)我可以告诉你,鉴于上面的代码,它将编译(假设没有奇怪的
#define
):str2foo;foo.a=1;foo.b=2;foo.c=3;foo.name=“bar”;/*很抱歉格式错误,无法在注释中发布多行格式的代码*/我猜他指的是QtCreator。@Georg@yan:问题的关键是在答案后添加随机细节,这通常意味着你需要一个新问题,或者应该有一个新问题。如果我不需要在另一个结构中重复使用该结构来进行后续操作,这将起作用-这里创建的类型的名称是什么?这不是你在帖子中所想的“str3”。@Yan:不,你不能像以前那样。您的示例创建了一个未命名类的实例。@Yan:#1是Microsoft的扩展,定义了一个匿名实例并使用了一个类型名,#2确实提供了一些IDL特有的东西,IDL基本上是另一种语言。在标准C++中,<代码>结构{};
定义了一个匿名类类型的实例。试试看,你会看到,我刚刚从一位嵌入式工程师那里找到了一些c代码,他在这个领域工作了25年,他的作品被NASA@Yan我不知道你的编译器是什么作为标准C++的扩展,但是我的意思是“用你问题中的代码。仅仅因为一个编译器允许它,并不意味着它在标准中。如果你仍然有疑问,可以提出一个问题。@GMan:嗯,它一定是一夜之间长大的——但我现在甚至收到了
@
通知;)