Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
1

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

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

Author24 — интернет-сервис помощи студентам
Приветствую всех. Возник вот такой вопрос. У меня есть, например, 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;
}
Можно ли создать динамический массив, где можно будет хранить сразу все эти структуры?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2014, 12:47
Ответы с готовыми решениями:

Хранение разных типов данных под одним указателем
Добрый день. Необходимо по одному указателю хранить структуры разных типов. Для этого для разных...

Хранение и вызов различных типов функций в одной переменной
Есть класс, который должен хранить функции и давать возможность их вызывать. Он выглядит примерно...

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

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

22
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
13.03.2014, 12:51 2
А чем наследование не угодило?
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 12:56  [ТС] 3
Ilot, поясните, плиз?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
13.03.2014, 13:19 4
Лучший ответ Сообщение было отмечено TenGen как решение

Решение

Например так:
Кликните здесь для просмотра всего текста
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;
}
2
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:27  [ТС] 5
Ilot, благодарю, сейчас попробую
0
365 / 321 / 219
Регистрация: 21.02.2013
Сообщений: 756
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];
}
1
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 13:48  [ТС] 7
jurok_85, вариант интересный, но нерациональный. Вопрос стоял именно в том, что бы помещать одну запись определенного типа в одну ячейку массива
0
aLarman
13.03.2014, 13:49
  #8

Не по теме:

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


Не по теме:

опоздал :)

0
365 / 321 / 219
Регистрация: 21.02.2013
Сообщений: 756
13.03.2014, 13:51 9
Цитата Сообщение от TenGen Посмотреть сообщение
помещать одну запись определенного типа в одну ячейку массива
а ну тогда наследование
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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, и С будут располагаться в одной и той же области памяти.
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.03.2014, 14:13 11
Наследование, конечно, поможет запихнуть объекты разных типов в один контейнер. Но тогда потеряется информация о конкретном типе каждого элемента. Когда будете из контейнера элементы, придётся делать dynamic_cast<>, что, мягко говоря, нехорошо.
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:15  [ТС] 12
John Prick, а вы какое решение можете посоветовать? Мне бы хотелось, что бы потом из него можно было извлекать данные без лишних телодвижений
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.03.2014, 14:21 13
TenGen, в первую очередь подумайте, зачем вам понадобилось помещать эти разные структуры в один контейнер. Возможно, найдётся какое-то другое решение. Опишите вашу задачу.
0
Будущее рядом
101 / 100 / 48
Регистрация: 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;
};
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.03.2014, 14:34 15
Цитата Сообщение от TenGen Посмотреть сообщение
И в этом массиве хочу хранить тип команды и нужные параметры. Само собой, количество и тип параметров различаются.
Возможно тогда вам следует сделать структуры команды такой:
C++
1
2
3
4
5
struct Command
{
    int type;
    SomeContainer<AbstractParameter> params;
};
А наследованием связать различные виды параметров. Кстати, что из себя представляют эти параметры?
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:36  [ТС] 16
John Prick, целые числа и строки. А назначение их может быть каким угодно, зависит от конкретной команды
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
13.03.2014, 14:43 17
TenGen, а почему тогда вы не используете подход Win API?
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
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 есть на этот случай).

Возможно, вам стоит подумать, нельзя ли как-то сделать параметры команды одного типа.
0
Будущее рядом
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
13.03.2014, 14:54  [ТС] 19
Ilot, я о таком не слышал) можно подробнее?

John Prick, думаю вот...
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
13.03.2014, 14:59 20
У любого приложения на Windows есть очередь т.н. сообщей. Т.е. любое событие происходящее с приложением описывается как структура типа MSG. Одно поле идентифицируется как код команды, смысл остальных полей зависит от типа сообщения. Одним словом гуглите оконная процедура там все будет понятно.
0
13.03.2014, 14:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2014, 14:59
Помогаю со студенческими работами здесь

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

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

Открытие разных типов файлов
Добрый день. Я тут задался вопросом &quot;а можно ли открыть изображение через fstream в бинарном...

Присваивание разных типов итераторам
При выводе элементов из указателей записанных во втором условном операторе if выводится много...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru