Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ioscat
1 / 1 / 0
Регистрация: 07.05.2014
Сообщений: 44
#1

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

11.07.2014, 15:23. Просмотров 558. Ответов 8
Метки нет (Все метки)

Всем привет!

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

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

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

как создать программу которая будет себя копировать? - C++
//????????????

Создать строку, которая будет содержать набор символов содержащихся в файле - C++
Открыть файл, имя которого задается с клавиатуры. Создать строку, которая будет содержать набор символов содержащихся в файле (каждый...

Создайте новую програму, которая будет включать класс fraction - C++
Создайте новую програму, которая будет включать класс fraction, созданные в Том упражнении. ...

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

разработать программу, которая будет использовать структуру в С - C++
1 . создать программу, которая будет использовать структуру human с элементами surname , name , age . Разработать создания и вывода на...

Создать програму,которая включяет структуру Tovar ,которая состоит из заданных полей. - C++
Помогите решить задачю!!! Создать програму,которая включяет структуру Tovar ,которая состоит из полей : код...

8
Renji
2063 / 1420 / 323
Регистрация: 05.06.2014
Сообщений: 4,083
11.07.2014, 16:14 #2
Реально создать объект который будет помнить какая конкретно структура в нем лежит (ФИО/время/объем) и ругаться матом если в нем лежит одно, а просят другое. Доступ ко всем данным придется делать только через методы класса. Реализация в простейшем случае - в объект пихаются все возможные структуры разом, методы доступа проверяют флаг "что конкретно здесь лежит" и в случае если во флаге что-то не то - кидают исключение.
Если первый байт заголовка файла = 1, то в структуре должны быть структура "Время", "Имя", а если = 2, то "Время", "ФИО", "Количество строк"
Эту логику тоже можно упрятать внутрь класса, но надо смотреть чем конкретно вы пытаетесь читать файл.
0
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;
    };
 
};
Со словом "создание" надо быть аккуратнее. Оно тебя заведет к "фабрикам"...
0
Renji
2063 / 1420 / 323
Регистрация: 05.06.2014
Сообщений: 4,083
11.07.2014, 16:30 #4
union годится только пока у B1, B2, B3 тривиальные конструкторы и деструкторы. Иначе сюрприз будет.
0
John Prick
830 / 763 / 152
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 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();
    // заполнение данными
}
Но всё зависит от того, что нужно получить в итоге.
0
olper
24 / 24 / 11
Регистрация: 02.12.2013
Сообщений: 75
11.07.2014, 16:45 #6
Цитата Сообщение от Renji Посмотреть сообщение
union годится
в рамках сформулированного вопроса, большего не требуется

А для более красивых решений, с привлечением мудрости "четырех", надо больше контекста и требований
0
ioscat
1 / 1 / 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

То есть от того, какие флаги стоят в полях, меняется состав сообщения.
0
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";
    }
0
ioscat
1 / 1 / 0
Регистрация: 07.05.2014
Сообщений: 44
14.07.2014, 09:30  [ТС] #9
Спасибо, наверное, это то, что нужно =)
0
14.07.2014, 09:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2014, 09:30
Привет! Вот еще темы с ответами:

Создать к базе данных форму, которая будет включать и запросы и добавление записей в таблицу - MS Access
Помогите создать к базе данных форму, которая будет включать и запросы и добавление записей в таблицу...Буду очень...

Сконструировать простой калькулятор который будет включать в себя следующие элементы - Delphi
Сконструировать простой калькулятор, который будет включать в себя следующие управляющие элементы:  поле редактирования, в которое...

Как создать программу, которая будет записывать себя в автозагрузку? - C++ WinAPI
как зделать чтобы прога при запуске записывала себя в автозагрузку

Создать структуру которая будет состоять из Стран содержащие города - C#
Помогите найти ошибки. Надо создать структуру которая будет состоять из Стран содержащие города. Не могу вывести сруктуру на консоль,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.