crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Выборки и БД на QList
NordWest
  опции профиля:
сообщение 23.9.2010, 9:17
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Здравствуйте.
Работаю с чем-то вроде БД, состоящей из QList списком указателей на слруктуры. QList <myStruct*> например. Т.е. первоначально загружаю такую таблицу в один список из файла. Затем делаю различные выборки с созданием других списков из отдельных элементов первого. При этом, найдя в основном списке нужную запись, делаю примерно так:
selList << origList.at(i)

Т.е. я надеюсь, что сами объекты будут в памяти в единственном экземпляре, а указатели на них в различных комбинациях располагаться по выборкам. Но похоже целостность данных в программе нарушается, возможно из-за той операции. Что конкретно происходит при таком заполнении выборок и безопасно ли это для исходной таблицы?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 23.9.2010, 9:38
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


const T& at(int) const; - возвращает константную ссылку и сама константная - т.е гарантированно не изменяет членов класса QList. в случает выхода за границы списка по-моему ASSERT в дебуг вылетит.
void operator<<(const T&) - принимает константную ссылку и размещает копию объекта в списке.
по идее целостность данных не нарушается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 23.9.2010, 9:52
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Спасибо! Этот вариант значит пока исключу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 23.9.2010, 9:57
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Мне кажется, эти строки протеворечат друг другу:
Цитата(kwisp @ 23.9.2010, 10:38) *
void operator<<(const T&) - принимает константную ссылку и размещает копию объекта в списке.

Цитата(NordWest @ 23.9.2010, 10:17) *
Т.е. я надеюсь, что сами объекты будут в памяти в единственном экземпляре, а указатели на них в различных комбинациях располагаться по выборкам.


Возможно поэтому целостность данных и нарушается, если под целостностью понимать непротиворечивость данных.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 23.9.2010, 9:59
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(Sokoloff @ 23.9.2010, 10:57) *
Мне кажется, эти строки протеворечат друг другу:

думаю не противоречат.
потому что контейнеры по идее работают с копиями обЪектов. в данном случае с копией указателя ничего сверхЪестественного....
принимает константную(потому что не изменяет копируемый обЪект) ссылку(потому что она в общем случае быстрее передается в функцию исключая множестенное копирование)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 23.9.2010, 10:17
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ну да, самих указателей может быть сколько угодно. Главное, чтобы указывали они туда куда надо и не затирались.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 23.9.2010, 13:22
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


может быть будет надёжнее использовать классы типа QPointer, если объекты унаследованы от QObject.
Т.к. имея "пачку указателей" со временем станет сложно следить за тем, чтобы сначала избавится от всех указателей и только потом от самого объекта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
NordWest
  опции профиля:
сообщение 23.9.2010, 19:55
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 86
Регистрация: 26.11.2008
Пользователь №: 433

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата
Т.к. имея "пачку указателей" со временем станет сложно следить за тем, чтобы сначала избавится от всех указателей и только потом от самого объекта

Да, вот что интересно. Если я в одной из выборок удаляю элемент removeAt(i), то удалится объект и исходная таблица потеряет элемент?


Цитата
может быть будет надёжнее использовать классы типа QPointer, если объекты унаследованы от QObject.

Нет, структуры не унаследованы. Ещё и со списками других структур внутри.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.9.2010, 10:00
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(NordWest @ 23.9.2010, 23:55) *
то удалится объект и исходная таблица потеряет элемент?
если ты хранишь указатели, то объект не удалится, удалится только указатель
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 14:37