![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
xRaux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
Задача следующая. Нужно реализовать класс, который будет выступать в роли умного указателя: операторы * и -> отложенно создают объект, который инициализируется значениями из базы данных. Проблема в том, что этот класс должен использоваться вместе с мета-свойствами Qt, которые не позволяют полноценно работать с шаблонами. У меня родился такой вариант:
Но он меня сильно не устраивает. 1. SomeMappedObject (как и любой другой потомок MappedObject) вынужден использовать голые указатели со всеми вытекающими - создавать объект в конструкторе, удалять в деструкторе. 2. Нет контроля типов для someProp. Хотелось бы писать что-то вроде Q_PROPERTY(MappedObjectPtr<SomeMappedObject> propName ...) Короче говоря, запутался я совсем. Может быть, возможно реализовать какой-нибудь другой, более приемлемый вариант? Заранее спасибо. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
xRaux, а зачем тебе это нужно?
|
|||
|
||||
xRaux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
Что именно, сорри?
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Зачем тебе нужен такой класс? Просто есть подозрение, что ты пытаешься решить основную задачу не теми методами. Поэтому залез в такие дебри. Если ты озвучишь основную задачу, то тебе подскажут оптимальное решение. |
|||
|
||||
xRaux |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
Это нечто вроде ORM - данные из базы мэппируются на объекты через свойства. Проблема в поддержке foreign keys - при мэппинге из такой, например, таблицы:
на класс
у меня возникают проблемы с полем author. Как его мэппировать? Хотелось бы, чтоб объект Author инициализировался не сразу при инициализации Book, а только при необходимости, то есть обращении к нему. Вот у меня и появилась мысль о том, что нужно сделать умный указатель. Это сообщение отредактировал(а) xRaux - 17.2.2012, 11:30 |
||||
|
|||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
дык делай SELECT с LEFT JOIN'ом. нет ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
xRaux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
xRaux, помести все свойства класса в приватную область. А доступ к ним через методы (как собственно в Qt сделано). При вызове метода свойства будут при необходимости инициализироваться и отдаваться пользователю.
|
|||
|
||||
xRaux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
bsa, то есть примерно так?
Нужно еще где-то хранить информацию об объекте Author, который должен быть создан (в этом примере - author_id). Это можно реализовать в защищенном интерфейсе MappedObject. Но опять же мне не нравится, что свойство отдает неизвестно кому голый указатель. Смириться? |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
xRaux, не могу до конца вашу затею понять..
для чего наследование от MappedObject ? |
|||
|
||||
xRaux |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.11.2011 Репутация: нет Всего: нет |
Можно аналогичный механизм реализовать и без наследования, суть не в этом. Просто так удобнее - можно предоставить методы типа load/save/create для синхронизации с базой данных. Практически аналогичный кодес есть, например, в QDjango. Правда, она для моих целей не совсем подходит, да и не нужна мне полноценная ORM. Плюс, реализованный там подход к сабжу, насколько я понял - те же голые указатели с ручной аллокацией-деаллокацией. Я хотел чуть-чуть это усовершенствовать. Это сообщение отредактировал(а) xRaux - 17.2.2012, 15:53 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Это сообщение отредактировал(а) bsa - 17.2.2012, 16:24 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |