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

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

Войти
Регистрация
Восстановить пароль
 
 
TenGen
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
#1

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

13.03.2014, 12:47. Просмотров 788. Ответов 22
Метки нет (Все метки)

Приветствую всех. Возник вот такой вопрос. У меня есть, например, 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2014, 12:47     Хранение разных типов
Посмотрите здесь:

Хранение и вызов различных типов функций в одной переменной - C++
Есть класс, который должен хранить функции и давать возможность их вызывать. Он выглядит примерно так: class Functions { public:...

Хранение в контейнере обьектов разных классов - C++
Здраствуйте. Есть небольшая иерархия классов, в вершине которой стоит абстрактный класс vehicle, а от него наследуеться пару классов....

Матрица из разных типов - C++
хочу создать клас Matrix елементы обьектов которого могли бы быть разных типов. была идея создать клас Cell и определить его как...

Сложение разных типов - C++
У меня из файла в переменную int считывется число.. Мне нужно занести в переменную string это число + строка. Например int...

Указатели разных типов - C++
Добрый день уважаемые форумчане !!! Хочу уточнить для себя следующую деталь. Есть базовый класс Fada и производные от него Tasa ...

Сравнение переменных разных типов - C++
Здравствуйте. Столкнулся с проблемой не совпадения типов данных. Есть переменная string str, которая, к примеру, имеет значение "1245"....

Использование разных типов указателей - C++
Здравствуйте! Программа должна засерать переменную n, а вместо этого она забивает мусором переменную upper. Можете подсказать в чём дело? ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 12:51     Хранение разных типов #2
А чем наследование не угодило?
TenGen
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 12:56  [ТС]     Хранение разных типов #3
Ilot, поясните, плиз?
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:27  [ТС]     Хранение разных типов #5
Ilot, благодарю, сейчас попробую
jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 518
Завершенные тесты: 1
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
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:48  [ТС]     Хранение разных типов #7
jurok_85, вариант интересный, но нерациональный. Вопрос стоял именно в том, что бы помещать одну запись определенного типа в одну ячейку массива
aLarman
13.03.2014, 13:49
  #8

Не по теме:

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


Не по теме:

опоздал

jurok_85
241 / 224 / 77
Регистрация: 21.02.2013
Сообщений: 518
Завершенные тесты: 1
13.03.2014, 13:51     Хранение разных типов #9
Цитата Сообщение от TenGen Посмотреть сообщение
помещать одну запись определенного типа в одну ячейку массива
а ну тогда наследование
zss
Модератор
Эксперт С++
6321 / 5905 / 1913
Регистрация: 18.12.2011
Сообщений: 15,181
Завершенные тесты: 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
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
13.03.2014, 14:13     Хранение разных типов #11
Наследование, конечно, поможет запихнуть объекты разных типов в один контейнер. Но тогда потеряется информация о конкретном типе каждого элемента. Когда будете из контейнера элементы, придётся делать dynamic_cast<>, что, мягко говоря, нехорошо.
TenGen
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:15  [ТС]     Хранение разных типов #12
John Prick, а вы какое решение можете посоветовать? Мне бы хотелось, что бы потом из него можно было извлекать данные без лишних телодвижений
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
13.03.2014, 14:21     Хранение разных типов #13
TenGen, в первую очередь подумайте, зачем вам понадобилось помещать эти разные структуры в один контейнер. Возможно, найдётся какое-то другое решение. Опишите вашу задачу.
TenGen
Будущее рядом
97 / 95 / 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
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 3
13.03.2014, 14:34     Хранение разных типов #15
Цитата Сообщение от TenGen Посмотреть сообщение
И в этом массиве хочу хранить тип команды и нужные параметры. Само собой, количество и тип параметров различаются.
Возможно тогда вам следует сделать структуры команды такой:
C++
1
2
3
4
5
struct Command
{
    int type;
    SomeContainer<AbstractParameter> params;
};
А наследованием связать различные виды параметров. Кстати, что из себя представляют эти параметры?
TenGen
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:36  [ТС]     Хранение разных типов #16
John Prick, целые числа и строки. А назначение их может быть каким угодно, зависит от конкретной команды
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 14:43     Хранение разных типов #17
TenGen, а почему тогда вы не используете подход Win API?
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 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
Будущее рядом
97 / 95 / 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++
Сразу скажу что надо. Есть функция pow(), так вот она принимает разные типы данных. У меня класс хочу сделать тоже самое. Подскажите как, я...

Не считает произведение разных типов данных - C++
Никак не могу разобраться, почему программа не хочет считать произведение. Вот часть кода: for (i=0;i&lt;N;i++) { p=1.0*ws/N; }...

Считать объекты из файла разных типов - C++
Добрый день, имеется текстовый файл такого вида: fgfd 32 cxv 54 43 hmgg 65 54 23

Объявить переменные разных типов в заголовке for - C++
Здравствуйте, хочу узнать можно ли как-то объявить в for переменные разных типов, например: for(int i=0, double d=1.2; i&lt;10; i++, d+=0.5)...

Двумерный вектор из разных типов - возможно? - C++
Добрый вечер. ага, как вечер, так начинаются походы по сказочным лесам :D Возник такой вопрос по поводу &quot;улучшения&quot; класса. ...


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

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

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