Как ссылаться на вложенную структуру? - PullRequest
0 голосов
/ 23 февраля 2012

Структура в структуре, как я называю внутреннюю структуру? мой текущий код

#include <iostream>
#include <string>

using namespace std;

int N_ITEMS;
int N_SEATS;

struct ST_SEATS{
struct ITM_TYPE {
   string name;
   float price;       
};
};

int main()
{
    cout << "Enter number of items: ";
    cin >> N_ITEMS;
    ST_SEATS seat[3];
    seat[1]::ITM_TYPE item[N_ITEMS];
    int i = 0;
    string name = "";
    string input;
    float price;
    while (i < N_ITEMS)
   {
      cout << "Input item name: ";
      cin >> input;
      item[i].name = input;
      cout << "item[" << i << "].name SET" << endl;
      cout << "Input item price: ";
      cin >> price;
      item[i].price = price;
      cout << "item[" << i << "].price SET" << endl;
      i++;
   }
   i = 0;
   while (i < N_ITEMS)
   {
      cout << "item[" << i << "].name = " << item[i].name << endl;
      cout << "item[" << i << "].price = " << item[i].price << endl;
      i++;
   }
   system("pause");
}

Я пытаюсь получить программу получения квитанций, в которой каждое место имеет свои собственные заказы. Я знаю, что это не относится к вопросу хорошо, попросите дополнительную информацию как ... О, ошибки, которые я почти забыл добавить

21 E:\Documents\School\Computing\SDD\Assign#2\Projects\random.cpp `::ITM_TYPE' has not been declared 

21 E:\Documents\School\Computing\SDD\Assign#2\Projects\random.cpp expected `;' before "item" 

30 E:\Documents\School\Computing\SDD\Assign#2\Projects\random.cpp `item' undeclared (first use this function) 

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Тип ITM_TYPE существует только один раз в области действия ST_SEATS.Для каждого набора ST_SEATS нет другого типа.Поэтому правильный способ определить его массив:

ST_SEATS::ITM_TYPE item[N_ITEMS];

Обратите внимание, однако, что ваша структура ST_SEATS фактически пуста (она не содержит никаких членов).Он действует только как пространство имен.Поэтому вы должны заменить его на пространство имен:

namespace ST_SEATS
{
  struct ITM_TYPE
  {
    string name;
    float price;       
  };
}

Хорошо, теперь я заметил, что вы на самом деле определяете массив из 3 ST_SEATS, но этот массив вообще не используется.Теперь я подозреваю, что вы, вероятно, ожидали, что ваш массив ITM_TYPE будет иметь член из ST_SEATS.Но в этом случае вы должны объявить такой член непосредственно в определении структуры.

Также теперь я замечаю, что размер вашего массива является переменной.Это невозможно в C ++ (хотя некоторые компиляторы предлагают его как расширение для локальных массивов).Поэтому я теперь думаю, что вы на самом деле хотите:

#include <vector>

struct ST_SEATS{
  struct ITM_TYPE {
    string name;
    float price;       
  };
  std::vector<ITM_TYPE> items; // a vector is basically a dynamic array
};

int main()
{
  cout << "Enter number of items: ";
  cin >> N_ITEMS;
  ST_SEATS seat[3];
  seat[1].items.resize(N_ITEMS);
  std::string name = "";
  std::string input;
  float price;
  for (int i=0; i < N_ITEMS; ++i)
  {
    std::cout << "Input item name: ";
    std::cin >> input;
    seat[1].items[i].name = input;
    std::cout << "item[" << i << "].name SET" << std::endl;
    std::cout << "Input item price: ";
    std::cin >> price;
    seat[1].item[i].price = price;
    std::cout << "item[" << i << "].price SET" << std::endl;
  }

  for (int i=0; i < N_ITEMS; ++i)
  {
    std::cout << "item[" << i << "].name = " << seat[1].items[i].name << std::endl;
    std::cout << "item[" << i << "].price = " << seat[1].items[i].price << std::endl;
  }
  system("pause");
}
1 голос
/ 23 февраля 2012

используйте это

ST_SEATS::ITM_TYPE st_seats;
0 голосов
/ 23 февраля 2012

seat[1] не тип.Доступ к внутреннему типу корыта ST_SEATS::ITM_TYPE.

Примечание. При включенных функциях C ++ 11 вы могли бы также сказать decltype(seat[1])::ITM_TYPE.

...