| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как сделать объект одного класса |
| Автор: Darked 29.10.2004, 09:15 | ||
| Всем Доброе время суток. Чего - то я запутался. Есть класс главного фрейма CMainFrame, в нем создаются два класса CDIsplay и CIndexLat_w32View, в CDisplay создается определенный объект CObject, в который я загружаю некоторые данные. Создаю объект другого класса m_Integral в CIndexLat_w32View,теперь вопрос: Как мне получить данные из Cobject в m_Integral??? Что - то типа того:
Вот и нужно получить доступ из m_Integral к данным CObject t, не используя глобальных объектови квалификатор friend. |
| Автор: Step 29.10.2004, 10:24 |
| можно глабальными поиграться можно из класс получать указатель на класс создателя с преобразованием типа потом используя этот указатель выбирать нужный объект и пошло и поехало... подобных уровней может быть много все зависит от иерархии объектов... в CIntegral нужно получить радителя... потом из радителя получить еще одного родителя в результате вы попадете в маин фрейм.. этот указатель нужно преобразовать к (CMainFrame*) после этого через этот указатель вы получаете доступ к m_disp а уже через него к t это все я называю "достоинством Добавлено @ 10:24 можно глабальными поиграться можно из класс получать указатель на класс создателя с преобразованием типа потом используя этот указатель выбирать нужный объект и пошло и поехало... подобных уровней может быть много все зависит от иерархии объектов... в CIntegral нужно получить радителя... потом из радителя получить еще одного родителя в результате вы попадете в маин фрейм.. этот указатель нужно преобразовать к (CMainFrame*) после этого через этот указатель вы получаете доступ к m_disp а уже через него к t это все я называю "достоинством |
| Автор: Darked 29.10.2004, 10:54 |
| Step Да уж, мне тоже бы не хотелось тянуть весь это хвост с указателями. Кстати, это не MFC, я в WTL пишу ;) Правда от этого не легче ;(((( |
| Автор: bel_nikita 29.10.2004, 11:11 |
| Darked Так может CObject - объявить виртуальным производным для классов class CDisplay и class CIndexLat_w32View? Типа: class CDisplay : virtual public CObject {}; class CIndexLat_w32View : virtual public CObject {}; И тогда CObject - будет одним объектом, но доступ к нему имеют CDisplay и CIndexLat_w32View В общем понял идею, я думаю |
| Автор: Mad 29.10.2004, 11:41 | ||
| Darked Тебе всеравно придется передовать классу CIndexLat_w32View, а через него CIntegral указатель на класс CDisplay, иначе получается неопределенность с обьектами класса. Как альтернатива, если это приминимо, обьявить переменную как static
тогда до неё отовсюду можно добраться CDisplay::t, но это подрозумевает, что ты создаеш только один обьект класса CDisplay. |
| Автор: Step 29.10.2004, 12:05 |
| я сам с этим вечно мучаюсь.. может вам сделать СДИ там хоть документ из любого вида получаеться... в него можно вбить все что вас интересует |
| Автор: Mad 29.10.2004, 12:13 | ||
| Step Насчет хранение в документе это мысль, хотя просто получается перемена мест хранение указателя (не у себя, а гдето, куда можно всегда добраться
Вобщем получить все открытые документы можно и в MDI приложении |
| Автор: Darked 29.10.2004, 12:16 |
| bel_nikita Ну у меня не совсем CObject, этот объект описан в не моей либе, мне просто предоставляют определенный тип данных. Да и идею с virtual не совсем понял. Добавлено @ 12:19 Step Понимаете ли в чем дело, я пишу в WTL, там нет архитектуры Документ/Вид. А приложение у меня и так SDI ;))) |
| Автор: bel_nikita 30.10.2004, 02:27 | ||||||||||||
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 30.10.2004, 12:45 | ||
| bel_nikita Вопервых твой пример и так франит указатели (ну не в переменных, так в VTABLE). Вовторых требует создание дополнительного класса (и соответственно обьекта). Втретьих это верно только для равного количества классов CDisplay и CIndexLat_w32View. (Тебе прийдется создавать класс оболочку для кожой комбинации этих классов). Ну и наконец, в твоем примере классы связанны намертво. (т.е невозможно заминить связи в уже созданых обьектах). Есть такой вариант
|
| Автор: bel_nikita 30.10.2004, 17:03 |
| Mad Понятно, что есть. Это один из вариантов. |
| Автор: Darked 2.11.2004, 21:36 |
| Большое спасибо всем за подсказки, решил в конструктор каждого класса передовать указатель на CMainFrame. |
| Автор: Step 3.11.2004, 10:49 | ||
|