Как использовать структуру внутри другой структуры? - PullRequest
5 голосов
/ 09 июня 2011

Я хочу использовать вложенную структуру, но я не знаю, как вводить в нее данные, например:

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

Так что в основном, когда я ее использую:

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

Это правильно, если нет, как мне его использовать?

Ответы [ 7 ]

13 голосов
/ 09 июня 2011

Каждая переменная-член структуры обычно имеет имя и тип .В вашем коде первый член A имеет тип int и имя data.Второй член имеет только тип.Вам нужно дать ему имя.Допустим, b:

struct A {
  int data;
  B b;
};

Чтобы сделать это, компилятор должен уже знать, что такое B, поэтому объявите, что struct до , вы объявите A.

Чтобы получить доступ к вложенному члену, обратитесь к каждому члену по пути по имени, разделенному .:

A stage;
stage.b.number = 5;
8 голосов
/ 09 июня 2011
struct A {
    struct B {
       int number;
    };
    B b;
    int data;
};
int main() {
    A a;
    a.b.number;
    a.data;
}
5 голосов
/ 09 июня 2011
struct B {  // <-- declare before
  int number;
};
struct A {
 int data;
 B b; // <--- declare data member of `B`
 };

Теперь вы можете использовать его как

stage.b.number;
2 голосов
/ 09 июня 2011

struct B в A должно иметь какое-то имя, чтобы вы могли ссылаться на него:

struct B {
    int number;
};
struct A {
    int data;
    struct B myB;
};
:
struct A myA;
myA.myB.number = 42;
0 голосов
/ 03 января 2017

У меня есть что-то вроде следующего кода, который работает некоторое время, и он работает.

//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 {

Определить таблицу освещения. Первый элемент - это 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;
0 голосов
/ 08 февраля 2014
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 голосов
/ 09 июня 2011
struct A 
{
  int data;
  struct B
  {
    int number;
  }b;
};

int main()
{
  A stage = { 42, {100} };
  assert(stage.data == 42);
  assert(stage.b.number == 100);   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...