![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Есть вот такой класс:
У меня в наличии только указатель на класс C. Как по этому указателю получить доступ к var ? Если я правильно понимаю, то вся эта вложенность классов не является наследованием и ни у одного из этих классов нет базового класса. Такое вот не прокатывает, т.к. требуется наследование:
error: `A' is not a base of `A::B::C' Зачем мне это надо. Хочу построить дерево с ограниченной глубиной, но чтобы не пришлось заводить переменную типа parent и была возможность возвращаться по дереву вверх. |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Класс C знает о существовании класса A, но объект класса С о соответствующем объекте класса А не знает. Тебе придется заводить parent.
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Да, заподло, думал удасться через метод получить переменную, не тут то было error: invalid use of nonstatic data member |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
когда в описании класса пишется "int a", это означает, что каждый объект класса A будет содержать свою переменную "a"
теперь вопрос: к переменной "a" какого объекта ты хочешь получить доступ? Это сообщение отредактировал(а) maxim1000 - 15.3.2008, 23:23 -------------------- qqq |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
С чего бы это каждому классу держать свою переменную a, если каждый из них базовый и никто никого не наследует ? Другое дело, что области видимости ограничены и вызов конструктора порождает вызов конструкторов классов, которые являются членами, но не потомками.
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
нет, каждый объект содержит переменную "a", не класс
в этом примере x.a и y.a - две разные переменные -------------------- qqq |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Без parent - никак)) классу надо где-то хранить, чья он ветка дерева. Если это критично для оптимизации - выложи полный код, тебе помогут, где чО соптимизировать в другом месте.
ты можешь "достучаться" до var, только если объявишь ее static - тогда var будет одна на все экземпляры класса A и к ней можно будет обращаться как A::var. Вот. А по сабжу чем тебе не угодила структурка с parent:
можно, если поломать голову, сделать так, чтобы глубина потомков проверялась на уровне компиляции, но код намного сложнее бует. Это сообщение отредактировал(а) comcon1 - 16.3.2008, 00:49 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
преждевременная оптимизация очень вредна
|
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Да, я смотрю тот еще геморрой. Поэтому пытаюсь перепроектировать классы. У меня сейчас есть класс, который содержит членом другой класс, а в нем около 20 своих членов, которые надо инициализировать. Через конструктор 20 параметров, я естественно, передавать не собираюсь, а потому инициализирую их вручную построчно. Но проблема в том, что в будущем, доступ на запись этих членов будет только через метод, а внутри обновление полей базы данных, соответственно их надо сделать приватными, но тогда, я не смогу их инициализировать из порождающего класса. Сейчас я прописал его как friend, чтобы получать доступ на запись не через методы для первичной инициализации. Есть еще мысль передать указатель на источник данных через конструктор, чтобы класс сам себя инициализировал, тогда friend не нужен. Как лучше поступить ?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
SABROG, изменить дизайн. ты где-то очень серьезно накосячил, вот и возникают проблемы.
Как вариант, можно сделать инициализацию структурой - конструктору передается указатель на нее. |
|||
|
||||
| SABROG |
|
||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Изначально класс и был той самой структурой, но из-за необходимости ввести ограничение в виде доступности к переменным только через методы, пришлось структуру преобразовать в класс. А теперь у меня есть метод вида "получить_значение_столбца_с_именем("описание")", который вызывается в цикле while и получает значения из базы данных и я уже распихиваю эти значения по разным классам, в зависимости от имени таблицы и типа колонки:
Просто какой смысл тогда делать так?:
|
||||||
|
|||||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
так делать - никакого смысла.
Обычно, если структура содержит много полей, то это скорее всего просто неверно. Хотя бывают некоторые исключения. Например, когда для рассчета какого-то процесса требуется много входных данных. Чаще всего, эти данные - константы (читай настройки), которые берутся, например, из файла. Соответственно, должна быть одна функция, которая тупо загружает эту структуру и все. В твоем случае, это не похоже на расчет сложного процесса. Неужели где-то требуются все данные сразу? Вряд ли. Соответственно, надо перегруппировать для начала. А там, возможно, и разделить. Вобщем, я так думаю... |
|||
|
||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 4 Всего: 91 |
Я кеширую базу данных размером в 10 мегабайт. А насчет расчета. Процесс может и не сложный, но на выходе будет до 1 миллиона цифр, и их формирование будет зависеть как раз от данных в базе. Если данные не будут предварительно загружены в память, то можно сразу 1 миллион умножать на количество запросов к базе данных... |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Может быть приоткроешь задачу немного подробнее, а то на договорках сложно посоветовать тебе ту или иную модель. Наверняка мы что-нибудь придумаем
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
SABROG, база данных, обычно, выглядит как несколько таблиц с наборами значений в каждой. Неужели в каждой таблице куча столбцов?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |