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

Хранение разных типов - C++

Восстановить пароль Регистрация
 
 
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 12:47     Хранение разных типов #1
Приветствую всех. Возник вот такой вопрос. У меня есть, например, 3 разных структуры, каждая из которых имеет разные поля:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct one
{
int x;
int y;
string value;
};
 
struct two
{
string k;
double a;
double b;
double c;
};
 
struct three
{
char t;
double z;
string name;
}
Можно ли создать динамический массив, где можно будет хранить сразу все эти структуры?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 12:51     Хранение разных типов #2
А чем наследование не угодило?
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 12:56  [ТС]     Хранение разных типов #3
Ilot, поясните, плиз?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 13:19     Хранение разных типов #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Например так:
Кликните здесь для просмотра всего текста
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
using namespace std;
struct base
{
virtual ~base() {};
};
struct one: base
{
 
int x;
int y;
string value;
};
 
struct two: base
{
string k;
double a;
double b;
double c;
};
 
struct three: base
{
char t;
double z;
string name;
};
int main ()
{
    base* mass[3];
    one* ptr1;
    two* ptr2;
    mass[0] = new one();
    mass[1] = new two();
    ptr1 = static_cast<one*>(mass[0]);
    ptr2 = static_cast<two*>(mass[1]);
    ptr1->x = 10;
    ptr2->b = 11;
    cout << ptr1->x << endl;
    cout << ptr2->b << endl;
    return 0;
}
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:27  [ТС]     Хранение разных типов #5
Ilot, благодарю, сейчас попробую
jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
13.03.2014, 13:41     Хранение разных типов #6
а такой вариант вместо наследования как вам?
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
30
31
32
33
34
#include <string>
using std::string;
struct one
    {
    int x;
    int y;
    string value;
    };
 
struct two
    {
    string k;
    double a;
    double b;
    double c;
    };
 
struct three
    {
    char t;
    double z;
    string name;
    };
 
    struct vse
    {
        one x;
        two y;
        three z;
    };
int main(){
 
vse* v = new vse[10];
}
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:48  [ТС]     Хранение разных типов #7
jurok_85, вариант интересный, но нерациональный. Вопрос стоял именно в том, что бы помещать одну запись определенного типа в одну ячейку массива
aLarman
13.03.2014, 13:49
  #8

Не по теме:

jurok_85, я думаю надо было в одном элементе массива хранить не все структуры, а одну


Не по теме:

опоздал

jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
13.03.2014, 13:51     Хранение разных типов #9
Цитата Сообщение от TenGen Посмотреть сообщение
помещать одну запись определенного типа в одну ячейку массива
а ну тогда наследование
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
13.03.2014, 14:09     Хранение разных типов #10
А еще есть union:
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
struct one
    {
    int x;
    int y;
    string value;
    };
 
struct two
    {
    string k;
    double a;
    double b;
    double c;
    };
 
struct three
    {
    char t;
    double z;
    string name;
    };
 
    union vse
    {
        one A;
        two B;
        three C;
    };
A,B, и С будут располагаться в одной и той же области памяти.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.03.2014, 14:13     Хранение разных типов #11
Наследование, конечно, поможет запихнуть объекты разных типов в один контейнер. Но тогда потеряется информация о конкретном типе каждого элемента. Когда будете из контейнера элементы, придётся делать dynamic_cast<>, что, мягко говоря, нехорошо.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:15  [ТС]     Хранение разных типов #12
John Prick, а вы какое решение можете посоветовать? Мне бы хотелось, что бы потом из него можно было извлекать данные без лишних телодвижений
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.03.2014, 14:21     Хранение разных типов #13
TenGen, в первую очередь подумайте, зачем вам понадобилось помещать эти разные структуры в один контейнер. Возможно, найдётся какое-то другое решение. Опишите вашу задачу.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:28  [ТС]     Хранение разных типов #14
John Prick, я вознамерился для некоторых целей сделать очень простой "скриптовый" язык. И в этом массиве хочу хранить тип команды и нужные параметры. Само собой, количество и тип параметров различаются.

Пока реализовал некую универсальную запись в виде
C++ (Qt)
1
2
3
4
5
6
struct node
{
node() : values(NULL), lines(NULL) {}
int *values;
QString *lines;
};
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.03.2014, 14:34     Хранение разных типов #15
Цитата Сообщение от TenGen Посмотреть сообщение
И в этом массиве хочу хранить тип команды и нужные параметры. Само собой, количество и тип параметров различаются.
Возможно тогда вам следует сделать структуры команды такой:
C++
1
2
3
4
5
struct Command
{
    int type;
    SomeContainer<AbstractParameter> params;
};
А наследованием связать различные виды параметров. Кстати, что из себя представляют эти параметры?
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:36  [ТС]     Хранение разных типов #16
John Prick, целые числа и строки. А назначение их может быть каким угодно, зависит от конкретной команды
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 14:43     Хранение разных типов #17
TenGen, а почему тогда вы не используете подход Win API?
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.03.2014, 14:49     Хранение разных типов #18
Тогда можно поступить так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class AbstractParameter
{
public:
    virtual ~AbstractParameter(void) {}
protected:
    AbstractParameter(void) {}
};
 
struct StringParameter: public AbstractParameter
{
    string value;
};
 
struct IntParameter: public AbstractParameter
{
    int value;
};
Структуру команды я уже указывал:
C++
1
2
3
4
5
struct Command
{
    int type;
    SomeContainer<AbstractParameter*> params;
};
Вот объекты типа Command вам и стоит хранить в массиве, а параметры команды - в контейнере params.

Однако, когда вы будете обращаться к конкретным параметрам, вам всё равно придётся как-то выяснять их тип. Толи с помощью dynamic_cast, толи ещё каким-нибудь способом (например, паттерн visitor есть на этот случай).

Возможно, вам стоит подумать, нельзя ли как-то сделать параметры команды одного типа.
TenGen
Будущее рядом
 Аватар для TenGen
96 / 94 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:54  [ТС]     Хранение разных типов #19
Ilot, я о таком не слышал) можно подробнее?

John Prick, думаю вот...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 14:59     Хранение разных типов
Еще ссылки по теме:

C++ Сравнение переменных разных типов
C++ Хранение и вызов различных типов функций в одной переменной
C++ Указатели разных типов

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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 14:59     Хранение разных типов #20
У любого приложения на Windows есть очередь т.н. сообщей. Т.е. любое событие происходящее с приложением описывается как структура типа MSG. Одно поле идентифицируется как код команды, смысл остальных полей зависит от типа сообщения. Одним словом гуглите оконная процедура там все будет понятно.
Yandex
Объявления
13.03.2014, 14:59     Хранение разных типов
Ответ Создать тему
Опции темы

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