![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
AndreySol |
|
|||
Unregistered |
Вопрос по обмену данными между двумя классами.
Помогите начинающему в Visual C++ и MFC. Нашел в сети подсказку как сделать два класса, использующие друг друга. Привожу дословно: "Есть два класса - для определенности назавем их CFirst и CSecond. В CFirst есть укзазатель на экземпляр второго класса, а в CSecond - указатель на экземпляр первого. И как это все должно работать - какой класс писать сначала? Делаем это так: Заголовочный файл для первого класса: class CSecond; class CFirst { public: CFirst(); ~CFirst(); ... CSecond* m_pSecond; }; Файл реализации для первого класса: #include "First.h" #include "Second.h" CFirst::CFirst() { m_pSecond = new CSecond; } CFirst::~CFirst() { delete m_pSecond; } Заголовочный файл для второго класса: class CFirst; class CSecond { public: CSecond(); ... CFirst* m_pFirst; }; Файл реализации для второго класса: #include "Second.h" #include "First.h" CFirst::CFirst() { ... } CFirst::~CFirst() { ... }". Попробовал применить это в ситуации когда в проекте имеется основной Dialog и класс наследованный к примеру от CListCtrl - ничего у меня не получается. Подскажите как правильно сделать, что бы можно было передавать данные из основного Диалога в другие классы и обратно. |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
В класе диалога, у тебя в любом случае есть указатель или объект на листктрл, а вот в наследуемом классе от лист ктрл надо объявить указатель на объект класса диалог, потом в диалоговом классе при инициализации диалога, но после инициализации контрола надо присвоить указателю указатель на диалоговый клас
выглядит это так class CSecond; class CFirst { public: CFirst(); sample(int a) ~CFirst(); ... CSecond* m_pSecond; }; Файл реализации для первого класса: #include "First.h" #include "Second.h" CFirst::CFirst() { m_pSecond = new CSecond; m_pSecond->m_pFirst=this; } CFirst::~CFirst() { delete m_pSecond; } Заголовочный файл для второго класса: class CFirst; class CSecond { public: CSecond(); ... CFirst* m_pFirst; sample2(int a); }; Файл реализации для второго класса: #include "Second.h" #include "First.h" CSecond::CSecond() { ... } CSecond::~CSecond() { ... CSecond::sample2(int a){ m_pFirst->sample(5) } В результате функция sample2 второго класа вызовет вункцию sample первого класа.... -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Или, вообще не парься. Сделай через сообщения или преобразование типов:
Принциальной разницы с предыдущим способом нет |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
Олег М, оригинально, но вариант с сообщением лучше не использовать так как для того что бы сообщения вызвало какието действия должно пройти время(обычно), а в это промежуток у тебя будут не верные данные
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
AndreySol |
|
|||
Unregistered |
Всем спасибо за ответы, пойду пробовать.
|
|||
|
||||
Alex2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 20.9.2004 Репутация: нет Всего: нет |
Попробовал так, только мне нужно из класса "class CDirTreeCtrl : public CTreeCtrl" вызвать функцию события OnSetfocusCombo1() класса "class CView1 : public CFormView" Вызов функции: m_pView1->OnSetfocusCombo1(); m_pView1 определена в заголовочном файле CDirTreeCtrl: CView1* m_pView1; Это в файле реализации CView1: CView1::CView1() : CFormView(CView1::IDD) { m_pDirTreeCtrl = new CDirTreeCtrl; m_pDirTreeCtrl->m_pView1=this; ... m_pDirTreeCtrl определена в заголовочном файле CView1: CDirTreeCtrl* m_pDirTreeCtrl; При отладке когда вызывается m_pView1->OnSetfocusCombo1() из события класса CDirTreeCtrl выдается: + m_pView1 0xcdcdcdcd {CView1 hWnd=???} Далее вызывается эта функция, но любые изменения, связанные с объектами класса CView1 вызывают ошибку: Unhandled Exception. Как это исправить? |
|||
|
||||
Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 5 Всего: 44 |
Может вызов происходит в промежутке. когда объект CView уже создан. а соответствующее окно еще нет, перд вызовом это стоит проверить.
-------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |