Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по обмену данными между двумя классами. Visual C++ и MFC 
:(
    Опции темы
AndreySol
Дата 6.6.2004, 05:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
Дата 8.6.2004, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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 первого класа....


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Олег М
Дата 11.6.2004, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Или, вообще не парься. Сделай через сообщения или преобразование типов:
Код

void CMyListCtrl::Func()
{
CWnd *pWnd=GetParent();
//Посылаем сообщение
pWnd->SendMessage(....);
//Или вызываем метод
static_cast<CDialog *>(pWnd)->SomeFunc();
//вместо static_cast иногда нужно использовать reinterpret_cast
}


Принциальной разницы с предыдущим способом нет
PM MAIL ICQ   Вверх
Step
Дата 11.6.2004, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Олег М, оригинально, но вариант с сообщением лучше не использовать так как для того что бы сообщения вызвало какието действия должно пройти время(обычно), а в это промежуток у тебя будут не верные данные


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
AndreySol
Дата 12.6.2004, 05:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всем спасибо за ответы, пойду пробовать.
  Вверх
Alex2
Дата 24.1.2005, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 20.9.2004

Репутация: нет
Всего: нет



Цитата
В результате функция sample2 второго класа вызовет вункцию sample первого класа....

Попробовал так, только мне нужно из класса "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.

Как это исправить?
PM MAIL   Вверх
Nastya
Дата 25.1.2005, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Может вызов происходит в промежутке. когда объект CView уже создан. а соответствующее окно еще нет, перд вызовом это стоит проверить.


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.