如何在另一个结构体中使用结构体?

16

我想使用嵌套结构,但我不知道如何输入数据。例如:

struct A {
    int data;
    struct B;
};

struct B {
    int number;
};

所以在main()函数中,当我开始使用它:

int main() {
    A stage;
    stage.B.number;
}

这样正确吗?如果不是,我该如何使用它?

7个回答

21

一般来说,结构体的每个成员变量都有一个名称和一个类型。在您的代码中,A的第一个成员具有类型int和名称data。第二个成员只有一个类型,你需要给它一个名称。假设叫做b

struct A {
  int data;
  B b;
};
为了做到这一点,编译器需要先知道什么是B,所以在声明A之前先声明该结构体。要访问嵌套成员,请按名称沿路径引用每个成员,用点号(.)分隔:
A stage;
stage.b.number = 5;

啊,你真是太棒了,所以我不说“struct B”,我说“B b”,好的,谢谢。 - Shadi
1
好吧,你可以struct B,但那只是类型。你仍然需要给它一个名字。(用struct B而不是只用B更像是C风格而不是C ++,所以如果你以那种方式编写代码,人们会认为你很奇怪。) - Rob Kennedy
1
最糟糕的是,他的原始代码完全合法。只是它不能做他想要的事情:他的成员struct B;声明存在一个嵌套类A::B,稍后将定义该类。而这与不是嵌套的B没有任何关系。 - James Kanze
如果提供的答案帮助您解决了问题,请不要忘记点击问题旁边的复选标记以正式接受其为答案。 - ikottman

16
struct A {
    struct B {
       int number;
    };
    B b;
    int data;
};
int main() {
    A a;
    a.b.number;
    a.data;
}

11
struct B {  // <-- declare before
  int number;
};
struct A {
 int data;
 B b; // <--- declare data member of `B`
 };

现在你可以这样使用它:

stage.b.number;

9

A 中的 struct B 必须有一个名称,以便您可以引用它:

struct B {
    int number;
};
struct A {
    int data;
    struct B myB;
};
:
struct A myA;
myA.myB.number = 42;

2
这是非法的。成员类型的定义必须在成员之前。 - James Kanze

2
struct A 
{
  int data;
  struct B
  {
    int number;
  }b;
};

int main()
{
  A stage = { 42, {100} };
  assert(stage.data == 42);
  assert(stage.b.number == 100);   
}

0
struct TestStruct {
    short Var1;
    float Var2;
    char Var3;

    struct TestStruct2 {
        char myType;
        CString myTitle;
        TestStruct2(char b1,CString b2):myType(b1), myTitle(b2){}
    };

    std::vector<TestStruct2> testStruct2;

    TestStruct(short a1,float a2,char a3): Var1(a1), Var2(a2), Var3(a3) {
        testStruct2.push_back(TestStruct2(0,"Test Title"));
        testStruct2.push_back(TestStruct2(4,"Test2 Title"));
    }       
};
std::vector<TestStruct> testStruct;

//push smthng to vec later and call 
testStruct.push_back(TestStruct(10,55.5,100));
TRACE("myTest:%s\n",testStruct[0].testStruct2[1].myTitle);

0

我已经运行了类似以下代码的一段时间,并且它可以正常工作。

// define a timer
struct lightTimer {
  unsigned long time; // time in seconds since midnight so range is 0-86400
  byte percentage; // in percentage so range is 0-100
};
    
// define a list of timers
struct lightTable {
  lightTimer timer[50];
  int otherVar;
};
    
// and make 5 instances
struct lightTable channel[5]; //all channels are now memory allocated

@zx485: 编辑:编辑/清理了代码。对于原始转储,请谅解。
解释:
定义一个lightTimer。基本上是一个包含2个变量的结构体。
    struct lightTimer {

定义一个 lightTable。第一个元素是 lightTimer。

    struct lightTable {

创建一个具名实例:
    struct lightTable channel[5];

我们现在有5个通道和50个定时器。

访问方式如下:

    channel[5].timer[10].time = 86400;
    channel[5].timer[10].percentage = 50;
    channel[2].otherVar = 50000;

在你的代码示例周围加上一些解释会严肃地提高你的回答质量。 - zx485

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接