Форум программистов, компьютерный форум CyberForum.ru

Создать структуру, которая будет включать в себя какой-то набор структур-компонент - C++

Восстановить пароль Регистрация
 
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
11.07.2014, 15:23     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #1
Всем привет!

Есть несколько структур-компонент, выбор структуры зависит от некоторого условия (от флага 1/2/3...)

Реально ли в самой программе создать структуру, которая будет включать в себя какой-то набор структур-компонент, соответствующий значению флага?

Пример:
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.07.2014, 15:23     Создать структуру, которая будет включать в себя какой-то набор структур-компонент
Посмотрите здесь:

C++ Создать програму,которая включяет структуру Tovar ,которая состоит из заданных полей.
C++ описать структуру, создать класс, в котором описать 3 поля: два простых типа и массив структур. Создать в классе 4 функции работы с массивом структур
как создать программу которая будет себя копировать? C++
C++ Создать строку, которая будет содержать набор символов содержащихся в файле
разработать программу, которая будет использовать структуру в С C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
11.07.2014, 16:14     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #2
Реально создать объект который будет помнить какая конкретно структура в нем лежит (ФИО/время/объем) и ругаться матом если в нем лежит одно, а просят другое. Доступ ко всем данным придется делать только через методы класса. Реализация в простейшем случае - в объект пихаются все возможные структуры разом, методы доступа проверяют флаг "что конкретно здесь лежит" и в случае если во флаге что-то не то - кидают исключение.
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Эту логику тоже можно упрятать внутрь класса, но надо смотреть чем конкретно вы пытаетесь читать файл.
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
11.07.2014, 16:28     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct B1{};
struct B2{};
struct B3{};
 
struct A
{
    int type;
    union structs
    {
        B1 b1;
        B2 b2;
        B3 b3;
    };
 
};
Со словом "создание" надо быть аккуратнее. Оно тебя заведет к "фабрикам"...
Renji
1535 / 983 / 240
Регистрация: 05.06.2014
Сообщений: 2,963
11.07.2014, 16:30     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #4
union годится только пока у B1, B2, B3 тривиальные конструкторы и деструкторы. Иначе сюрприз будет.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
11.07.2014, 16:45     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #5
Цитата Сообщение от ioscat Посмотреть сообщение
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Можно, конечно, сделать различные структуры на каждый из вариантов заголовка файла, но это будет сложнорасширяемое решение.

Как мне кажется, можно сделать так: (приблизительно)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef std::vector<std::string> DataContainer;
typedef std::map<string, DataContainer> DataTable;
DataTable table;
// ...
// чтение файла
if (first_byte == 1)
{
    table["Время"] = DataContainer();
    table["Имя"] = DataContainer();
    // заполнение данными
} else if (first_byte == 2)
{
    table["Время"] = DataContainer();
    table["ФИО"] = DataContainer();
    table["Количество строк"] = DataContainer();
    // заполнение данными
}
Но всё зависит от того, что нужно получить в итоге.
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
11.07.2014, 16:45     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #6
Цитата Сообщение от Renji Посмотреть сообщение
union годится
в рамках сформулированного вопроса, большего не требуется

А для более красивых решений, с привлечением мудрости "четырех", надо больше контекста и требований
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
11.07.2014, 19:01  [ТС]     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #7
Так, попробую более точно сказать, что мне нужно:

Есть данные в виде
dataFlag 3 bytes
timecode 4 bytes
dataID 3 bytes
data *
- if data[0] = 0
- - 1 byte
- if data[0] = 1
- - dataSize 2 bytes
- - dataCode 1 byte
-if data[0] = 2
- - dataSize 2 bytes
- - dataValue 4 bytes

То есть от того, какие флаги стоят в полях, меняется состав сообщения.
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
11.07.2014, 19:45     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #8
Цитата Сообщение от ioscat Посмотреть сообщение
меняется состав сообщения.
Ну раз о создание структур теперь речи не идет, то тогда только описания под разные "составы".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
struct s0
    {       
        unsigned char empty;
    };
    struct s1
    {
        unsigned short dataSize;
        unsigned char dataCode;
    };
 
    struct s2
    {
        unsigned short dataSize;
        unsigned char dataValue;
    };
 
    struct super
    {
        unsigned char dataFlag[3];
        unsigned int timecode;
        unsigned char dataID[3];
        unsigned char dataflag;
        union data
        {
            s0 s_o;
            s1 s_1;
            s2 s_2;
        };
    };
а для работы с сообщением
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void *message;
    super *pSuper = (super*)message;
 
    switch (pSuper->unionDataflag)
    {
    case 0:
        std::cout<<pSuper->data.s_o.empty;
        break;
    case 1:
        std::cout<<pSuper->data.s_1.dataSize<<"\t"<<pSuper->data.s_1.dataCode;
        break;
    case 2:
        std::cout<<pSuper->data.s_2.dataSize<<"\t"<<pSuper->data.s_2.dataValue;
        break;
    default:
        std::cout<<"shit happend";
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2014, 09:30     Создать структуру, которая будет включать в себя какой-то набор структур-компонент
Еще ссылки по теме:

Создать программу, которая будет определять с какой буквы вы ввели слово с А, с Б или с В и выводить об этом сообщение C++
Создать программу которая будет выводить каждое 4 слово C++
C++ Создать структуру, которая содержит данные о наличии путевок в турагенстве

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ioscat
0 / 0 / 0
Регистрация: 07.05.2014
Сообщений: 44
14.07.2014, 09:30  [ТС]     Создать структуру, которая будет включать в себя какой-то набор структур-компонент #9
Спасибо, наверное, это то, что нужно =)
Yandex
Объявления
14.07.2014, 09:30     Создать структуру, которая будет включать в себя какой-то набор структур-компонент
Ответ Создать тему
Опции темы

Текущее время: 19:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru