Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Как из глобальной функции, вызвать функцию класса? 
V
    Опции темы
Edik
Дата 2.11.2007, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



Предположим у меня есть глобальная функция void MyFunc(void); и есть функция класса void CMyClass::OnError(); так вот как мне из этой MyFunc(); вызвать CMyClass::Error(). Пробывал так:
Код

CMyClass myclass;
myclass.Error();

Ничего не выходит. Пробывал и так:
Код

СMyClass *myclass;
myclass=new CMyClass;
myclass->Error();

Тоже ничего не выходит. Пробывал и так:
Код

CMyClass *myclass=(CMyClass*)AfxGetMainWnd();
myclass->Error();


Подскажите выход.
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



В функцию передавай this параметром например MyFunck(void *param)

А в функции делай   СMyClass *myclass = (СMyClass*) param;


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 2.11.2007, 13:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Edik @  2.11.2007,  12:05 Найти цитируемый пост)
Ничего не выходит.

что значит не выходит ?
PM MAIL   Вверх
archimed7592
Дата 2.11.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(Edik @  2.11.2007,  12:05 Найти цитируемый пост)
Ничего не выходит.

Либо такой ф-ции в CMyClass не существует(м.б. OnError, а не Error?), либо она private/protected.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Edik
Дата 2.11.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



не, функция есть- но не вызываеться. а через this не получиться, так как это не функция вызываеться из диалога, что бы this класса диалога передать в функцию и через этот this запустить диалог. она у меня вобще то в dll размещеная эта фунция. к тому не просто в мфс приложениях у меня это тоже не получилось. мне это чисто интересно как сделать. такое у меня часто в программах встречаеться. что бы из глобальной функции моей MyFunc() вызвать CMyClass::OnError(). Да функция есть, но ... не вызываеться. Ошибка исполнения на методе Dlg.DoModal(). как же в нее передаш указатель this класса диалога?
PM MAIL   Вверх
Andrey44
Дата 2.11.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

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



Подожди, а как ты из Dlg.DoModal() вызываешь функции класса?


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
zkv
Дата 2.11.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



пример:
Код

class CMyClass
{
public:
  void Method()
  {}
  static void StaticMethod()
  {}
};

CMyClass g_myClass;

void GlobalFunction()
{
   g_myClass.Method();
  CMyClass::StaticMethod();
}


Это сообщение отредактировал(а) zkv - 4.11.2007, 06:45
PM MAIL   Вверх
Edik
Дата 2.11.2007, 16:25 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



Так вот, продолжим. Мой код.
Код

// GlobalFuncDlg.h

void MyFunc(void);   //Глобальная функция

class CGlobalFuncDlg : public CDialog
{
// Construction
public:
    CGlobalFuncDlg(CWnd* pParent = NULL);    // standard constructor

// Dialog Data
    //{{AFX_DATA(CGlobalFuncDlg)
    enum { IDD = IDD_GLOBALFUNC_DIALOG };
    CEdit    m_edit;      //Мое поле редактирования
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CGlobalFuncDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    //{{AFX_MSG(CGlobalFuncDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnButton1();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CGlobalFuncDlg MyClass;    //Объявление класса


// GlobalFuncDlg.cpp

void MyFunc()
{
MyClass.m_edit.SetWindowText("Hello!");
}

Короче мне вот так вот типа надо такого плана доступ получить к m_edit, ну и естественно через класс GlobalFuncDlg. Дальше так же можна и доступ к функциям класса получить, если пример получиться. Так вот- ошибка:
Linking...
GlobalFuncDlg.obj : error LNK2005: "class CGlobalFuncDlg MyClass" (?MyClass@@3VCGlobalFuncDlg@@A) already defined in GlobalFunc.obj


Это сообщение отредактировал(а) zkv - 4.11.2007, 06:46
PM MAIL   Вверх
Fazil6
Дата 2.11.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Edik @  2.11.2007,  16:25 Найти цитируемый пост)
CGlobalFuncDlg MyClass;    //Объявление класса

Уважаемый, читайте, что вам линкер пишет. Такие, как Вы выразились "Объявление класса" нельзя в хедерах делать ибо будете иметь то, что имеете


Это сообщение отредактировал(а) zkv - 4.11.2007, 06:47
PM MAIL   Вверх
Edik
Дата 4.11.2007, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 13.9.2006

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



После моих недолгих проб и ошибок, я в конце концов нашел решение моей проблемы. Реально, рабочий код.
Код

void MyFunc()
    {
        CGlobalFuncDlg *MyClass=(CGlobalFuncDlg *)AfxGetApp()->m_pMainWnd;
        MyClass->m_edit.SetWindowText("Hello!");
    }

А вот zkv даже подсказал более утонченное, но не столь для меня актульное решение:
Код

void MyFunc()
{
    if( CGlobalFuncDlg *pDlg = dynamic_cast<CGlobalFuncDlg *>( AfxGetMainWnd() ) )
        pDlg->m_edit.SetWindowText("Hello!");
}



Это сообщение отредактировал(а) zkv - 4.11.2007, 06:48
PM MAIL   Вверх
zkv
Дата 4.11.2007, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Удалил оффтоп/эмоции. Тема закрыта.
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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