Russian Qt Forum
Ноябрь 23, 2024, 15:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Мильён структур и типов  (Прочитано 8736 раз)
OKTA
Гость
« : Март 31, 2014, 15:36 »

Товарищи, посоветуйте, как лучше сделать.
Имею библиотеку, которая выдает структуру, в которой лежит указатель на одну из 4 структур других типов, в каждой из которых лежит несколько полей данных, которые могут быть нескольких типов(около 10 разных). Принимая такие структуры, мне надо засунуть из в таблицу, но перед этим хочу создать свой контейнер для их хранения. Но проблема в том, что я могу узнать, что лежит в каждой отдельной структуре, лишь когда ее открою и так же типы данных вижу только в самый последний момент (первым полем в каждой структуре - идентификатор типа данных остальных полей). Как лучше сделать, чтобы было удобно хранить и избавить себя от миллиона явных преобразований типов? Только через шаблоны?  Непонимающий
Записан
Bepec
Гость
« Ответ #1 : Март 31, 2014, 16:14 »

Ммм... А в чем проблема? у вас есть структура. Возьмём класс, добавим ему возможности иметь неизвестное количество полей неизвестного формата (ну ваших 10 разных). И при добавлении будет инициализировать его вашими структурами. В результате получится массив указателей на классы структур. Или указатель на главную ноду.

PS вроде бы стандартный такой древовидный подход Улыбающийся

PPS 1 класс для хранения и шаблонный класс для типов. Хотя хз какие у вас там типы, мб шаблон больно вычурный получится.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Март 31, 2014, 16:56 »

2ОКТА А как вы эту древовидную структуру хотите в таблице отображать?
Записан
OKTA
Гость
« Ответ #3 : Март 31, 2014, 18:02 »

2ОКТА А как вы эту древовидную структуру хотите в таблице отображать?


Да это не особо древовидная структура. Если грубо на словах, то опуская все тонкости имеем 4 типа контейнеров -  array/range/enumeration/one_value, в каждом из которых тип данных может быть любым из встроенных типов и еще нескольких пользовательских. Т.е. каждая строка таблицы - это один контейнер. Видимо другого пути, как и советует Верес, нет - создать шаблонный класс c вложенным шаблоном (или как это сказать по-русски - nested template) для контейнеров, проинициализировать их и засунуть в массив, не забыв еще и добавить тип контейнера и тип данных в каждом контейнере. А когда будем работать с ним в интерфейсе - открываем контейнер, смотрим на его тип и тип данных и шпарим.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Март 31, 2014, 18:12 »

Покажите на примере такой шаблонный класс.

Мне вот кажется, что все это можно положить в список контейнеров:
Код
C++ (Qt)
QList<Container*> items;
 

А Container это базовый класс от которого происходят контейнеры: array, range, enumeration и one_value.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #5 : Март 31, 2014, 18:54 »

может union ?
Записан
OKTA
Гость
« Ответ #6 : Апрель 01, 2014, 10:23 »

Union не даст никаких преимуществ я думаю.
Начал так  - 4 структуры и класс контейнера. Ну и дальше да, в QList их.
Делать базовый класс для контейнеров пока поостерегся - у структур нет ничего общего, кроме одного поля, определяющего тип.
Приму все замечания  Улыбающийся
Код:
template <class T> struct onevalue {
    //

    ushort itemType;
    T item;

};

template <class T, template <class> class P >
class Container
{
public:
    P<T> data;
};

Container <int, onevalue> testContainer;
Это пока так, заготовка, в класс еще надо добавить несколько полей..
« Последнее редактирование: Апрель 01, 2014, 10:28 от OKTA » Записан
OKTA
Гость
« Ответ #7 : Апрель 01, 2014, 11:23 »

Ан нет, твоя правда Old..
Надо делать класс, а в нем уже все преобразования делать - в QList так просто не подсунешь шаблонный класс.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Апрель 01, 2014, 12:33 »

Для отображения в таблице можно придумать универсальный интерфейс, тогда никаких преобразований вообще не понадобиться.
А если возможно использовать универсальный интерфейс и для модификации, то они вообще не понадобятся. Улыбающийся
Записан
OKTA
Гость
« Ответ #9 : Апрель 01, 2014, 12:41 »

Да, я уже иду к этому  Смеющийся
Подумал, что чтобы не мучиться с хранением, буду использовать QVariant, а уже в таблице в зависимости от типа данных принимать решение, как их визуализировать  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Апрель 01, 2014, 12:46 »

а уже в таблице в зависимости от типа данных принимать решение, как их визуализировать  Улыбающийся
Так это же прямой путь к 100500 switch & cast. Вроде от этого хотели уйти. Улыбающийся
Записан
OKTA
Гость
« Ответ #11 : Апрель 01, 2014, 12:59 »

В любом случае придется использовать switch + cast, чтобы сохранить данные в своих контейнерах  Плачущий
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Апрель 01, 2014, 13:07 »

В любом случае придется использовать switch + cast, чтобы сохранить данные в своих контейнерах  Плачущий
Ну это один раз. А так switch + cast будет в каждом втором методе.
Записан
OKTA
Гость
« Ответ #13 : Апрель 01, 2014, 13:11 »

Попробую обмозговать вашу идею  Улыбающийся
Записан
OKTA
Гость
« Ответ #14 : Апрель 02, 2014, 10:35 »

Ешкин кот, придется убить эту идею с преобразованием и хранением данных и использовать их в исходном виде.. Выяснилось, что придется еще реализовывать задачу установки новых значений, а для этого надо, чтобы данные были в тех же формтах, в каком приходят из библиотеки. Так что проще реализовать универсальную модель и универсальный интерфейс для отображения и изменения.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.071 секунд. Запросов: 22.