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

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

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

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

13.03.2014, 12:47. Просмотров 815. Ответов 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++):

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

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

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

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

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

Открытие разных типов файлов - C++
Добрый день. Я тут задался вопросом "а можно ли открыть изображение через fstream в бинарном режиме?", через пару минут понял что нет. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,074
Записей в блоге: 5
Завершенные тесты: 1
13.03.2014, 12:51 #2
А чем наследование не угодило?
TenGen
Будущее рядом
97 / 95 / 20
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 12:56  [ТС] #3
Ilot, поясните, плиз?
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,074
Записей в блоге: 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
Сообщений: 519
Завершенные тесты: 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
Сообщений: 519
Завершенные тесты: 1
13.03.2014, 13:51 #9
Цитата Сообщение от TenGen Посмотреть сообщение
помещать одну запись определенного типа в одну ячейку массива
а ну тогда наследование
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,229
Завершенные тесты: 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
779 / 712 / 131
Регистрация: 27.07.2012
Сообщений: 2,045
Завершенные тесты: 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
779 / 712 / 131
Регистрация: 27.07.2012
Сообщений: 2,045
Завершенные тесты: 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
779 / 712 / 131
Регистрация: 27.07.2012
Сообщений: 2,045
Завершенные тесты: 3
13.03.2014, 14:34 #15
Цитата Сообщение от TenGen Посмотреть сообщение
И в этом массиве хочу хранить тип команды и нужные параметры. Само собой, количество и тип параметров различаются.
Возможно тогда вам следует сделать структуры команды такой:
C++
1
2
3
4
5
struct Command
{
    int type;
    SomeContainer<AbstractParameter> params;
};
А наследованием связать различные виды параметров. Кстати, что из себя представляют эти параметры?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 14:34
Привет! Вот еще темы с ответами:

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

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

Разделение строки на переменные разных типов - C++
Помогите с разделением строки Есть String dat dat = &quot;40.10 50.10 60.10 70.10 11:15:23 4-03-2012&quot; необходимо разделить ее на 4...

Функция приема разных типов в классе - C++
Сразу скажу что надо. Есть функция pow(), так вот она принимает разные типы данных. У меня класс хочу сделать тоже самое. Подскажите как, я...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.03.2014, 14:34
Ответ Создать тему
Опции темы

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