![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Всем Доброе время суток.
Чего - то я запутался. Есть класс главного фрейма CMainFrame, в нем создаются два класса CDIsplay и CIndexLat_w32View, в CDisplay создается определенный объект CObject, в который я загружаю некоторые данные. Создаю объект другого класса m_Integral в CIndexLat_w32View,теперь вопрос: Как мне получить данные из Cobject в m_Integral??? Что - то типа того:
Вот и нужно получить доступ из m_Integral к данным CObject t, не используя глобальных объектови квалификатор friend. -------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
можно глабальными поиграться можно из класс получать указатель на класс создателя с преобразованием типа потом используя этот указатель выбирать нужный объект и пошло и поехало... подобных уровней может быть много все зависит от иерархии объектов...
в CIntegral нужно получить радителя... потом из радителя получить еще одного родителя в результате вы попадете в маин фрейм.. этот указатель нужно преобразовать к (CMainFrame*) после этого через этот указатель вы получаете доступ к m_disp а уже через него к t это все я называю "достоинством Добавлено @ 10:24 можно глабальными поиграться можно из класс получать указатель на класс создателя с преобразованием типа потом используя этот указатель выбирать нужный объект и пошло и поехало... подобных уровней может быть много все зависит от иерархии объектов... в CIntegral нужно получить радителя... потом из радителя получить еще одного родителя в результате вы попадете в маин фрейм.. этот указатель нужно преобразовать к (CMainFrame*) после этого через этот указатель вы получаете доступ к m_disp а уже через него к t это все я называю "достоинством -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Step
Да уж, мне тоже бы не хотелось тянуть весь это хвост с указателями. Кстати, это не MFC, я в WTL пишу ;) Правда от этого не легче ;(((( -------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Darked
Так может CObject - объявить виртуальным производным для классов class CDisplay и class CIndexLat_w32View? Типа: class CDisplay : virtual public CObject {}; class CIndexLat_w32View : virtual public CObject {}; И тогда CObject - будет одним объектом, но доступ к нему имеют CDisplay и CIndexLat_w32View В общем понял идею, я думаю |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
Darked
Тебе всеравно придется передовать классу CIndexLat_w32View, а через него CIntegral указатель на класс CDisplay, иначе получается неопределенность с обьектами класса. Как альтернатива, если это приминимо, обьявить переменную как static
тогда до неё отовсюду можно добраться CDisplay::t, но это подрозумевает, что ты создаеш только один обьект класса CDisplay. |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
я сам с этим вечно мучаюсь.. может вам сделать СДИ там хоть документ из любого вида получаеться... в него можно вбить все что вас интересует
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
Step
Насчет хранение в документе это мысль, хотя просто получается перемена мест хранение указателя (не у себя, а гдето, куда можно всегда добраться
Вобщем получить все открытые документы можно и в MDI приложении |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
bel_nikita
Ну у меня не совсем CObject, этот объект описан в не моей либе, мне просто предоставляют определенный тип данных. Да и идею с virtual не совсем понял. Добавлено @ 12:19 Step Понимаете ли в чем дело, я пишу в WTL, там нет архитектуры Документ/Вид. А приложение у меня и так SDI ;))) -------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| bel_nikita |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Darked
CObject - трогать не будем, его просто объявляем vitrual'ым базовым классом для классов CDisplay и CIndexLat_w32View. Допустим у нас уже есть класс CObject с двумя методами:
Для того чтобы не использовать глобальных объектов и квалификаторов friend немного извратимся 1. Объявляем CObject виртуальным для CDisplay:
2. Объявляем CObject виртуальным для CIndexLat_w32View:
3. А сейчас самое интересное
4. Это все Теперь можно протестировать:
Вот, вроде, то, что требовалось доказать, т.е. никаких static'ов и friend'ов. CIndexLat_w32View и CDisplay могут одновременно свободно юзать CObject. Т.е. если раньше объект CObject был доступен только CDisplay, то теперь и CIndexLat_w32View имеет к нему доступ. |
||||||||||||
|
|||||||||||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
bel_nikita
Вопервых твой пример и так франит указатели (ну не в переменных, так в VTABLE). Вовторых требует создание дополнительного класса (и соответственно обьекта). Втретьих это верно только для равного количества классов CDisplay и CIndexLat_w32View. (Тебе прийдется создавать класс оболочку для кожой комбинации этих классов). Ну и наконец, в твоем примере классы связанны намертво. (т.е невозможно заминить связи в уже созданых обьектах). Есть такой вариант
|
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Mad
Понятно, что есть. Это один из вариантов. |
|||
|
||||
| Darked |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 536 Регистрация: 26.2.2004 Где: Южный Урал Репутация: нет Всего: нет |
Большое спасибо всем за подсказки, решил в конструктор каждого класса передовать указатель на CMainFrame.
-------------------- Veni, Vidi, Vici !!! |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |