Поиск:

Ответ в темуСоздание новой темы Создание опроса
> где находится реализация CWinApp::Run 
:(
    Опции темы
pms
Дата 23.6.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А скажите, пожалуйста, кто знает, почему CWinApp::Run объявлена как virtual. И где находится реализация этой функции? smile  
PM MAIL   Вверх
SergeCpp
Дата 23.6.2006, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Виртуальная она для того, чтобы Вы могли её при желании переопределить в производном классе.

APPCORE.CPP
Код
// Main running routine until application exits
int CWinApp::Run()
{
    if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
    {
        // Not launched /Embedding or /Automation, but has no main window!
        TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
        AfxPostQuitMessage(0);
    }
    return CWinThread::Run();
}

THRDCORE.CPP
Код
// main running routine until thread exits
int CWinThread::Run()
{
    ASSERT_VALID(this);

    // for tracking the idle time state
    BOOL bIdle = TRUE;
    LONG lIdleCount = 0;

    // acquire and dispatch messages until a WM_QUIT message is received.
    for (;;)
    {
        // phase1: check to see if we can do idle work
        while (bIdle &&
            !::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE))
        {
            // call OnIdle while in bIdle state
            if (!OnIdle(lIdleCount++))
                bIdle = FALSE; // assume "no idle" state
        }

        // phase2: pump messages while available
        do
        {
            // pump message, but quit on WM_QUIT
            if (!PumpMessage())
                return ExitInstance();

            // reset "no idle" state after pumping "normal" message
            if (IsIdleMessage(&m_msgCur))
            {
                bIdle = TRUE;
                lIdleCount = 0;
            }

        } while (::PeekMessage(&m_msgCur, NULL, NULL, NULL, PM_NOREMOVE));
    }

    ASSERT(FALSE);  // not reachable
}

Пример переопределения
Код
int LifeApp::Run()
{
    for(;;)
    {
        BOOL msg  ( FALSE );
        BOOL idle ( TRUE  );
        long count( 0     );

        do
        {
            idle &=   OnIdle     (    count++ );
            msg   = ::PeekMessage( &m_msgCur, NULL, NULL, NULL, PM_REMOVE );
        }
        while( idle && ( !msg || m_msgCur.message == WM_KICKIDLE ) );

        do
        {
            if( !msg )
            {
                ::GetMessage( &m_msgCur, NULL, NULL, NULL );
            }

            if( m_msgCur.message == WM_QUIT )
            {
                return ExitInstance();
            }

            if( m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage( &m_msgCur ) )
            {
                ::TranslateMessage( &m_msgCur );
                ::DispatchMessage ( &m_msgCur );
            }

            if( IsIdleMessage( &m_msgCur ) )
            {
                idle  = TRUE;
                count = 0;
            }

            msg = ::PeekMessage( &m_msgCur, NULL, NULL, NULL, PM_REMOVE );
        }
        while( msg );
    }
}
  

Это сообщение отредактировал(а) SergeCpp - 23.6.2006, 08:58
PM MAIL WWW ICQ   Вверх
pms
Дата 30.6.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Благодарю за ответ. Но вот еще, что не совсем понятно. Почему нельзя добраться до реализации этой функции обычным путем, т.е. по цепочке предок->потомок. Вот что получается:
MyProgram.h
Код

...
class CMyProgramApp : public CWinApp
...


<Go To Declaration of CWinApp>

AFXWIN.H
Код

...
class CWinApp : public CWinThread
{
...
virtual int Run();
<Go To Definition of Run>
...
}
...
class CWinThread : public CCmdTarget
{
virtual int Run();
}


Т.е. получается что она изначально объявляется в CWinThread как virtual, наследуется в CWinApp снова без реализации, далее в CMyProgramApp, но и здесь ее реализации нет. Что не верно в моих рассуждениях? 
PM MAIL   Вверх
SergeCpp
Дата 30.6.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Реализация представлена Вам в первом моём ответе...

Первое окно с кодом — это реализация CWinApp::Run()
Второе окно с кодом — это реализация CWinThread::Run()

virtual member function
pure virtual function 

Это сообщение отредактировал(а) SergeCpp - 30.6.2006, 10:47
PM MAIL WWW ICQ   Вверх
pms
Дата 30.6.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да я понял, что это реализация. Но я хочу узнать как компилятор "узнает", что это есть реализация этой функции? Прошу прощения за недостаточную внятность вопросов... 
PM MAIL   Вверх
SergeCpp
Дата 30.6.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



С указателем на объект связана таблица vtable, где находятся указатели на виртуальные функции.
Узнаёт не компилятор. Во время выполнения производится переход по этому указателю.
Это вкратце. 
PM MAIL WWW ICQ   Вверх
pms
Дата 30.6.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо. Кстати, а где вообще происходит вызов этой функции? Или может Вы скажете где подробнее можно об этом прочесть? 
PM MAIL   Вверх
SergeCpp
Дата 30.6.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



The Design and Evolution of C++

user posted image

Вот тут есть несколько прекрасных книг

Ну, и это...
user posted image 

Это сообщение отредактировал(а) SergeCpp - 30.6.2006, 13:16
PM MAIL WWW ICQ   Вверх
DeadSoul
Дата 1.7.2006, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(pms @  30.6.2006,  13:02 Найти цитируемый пост)
Кстати, а где вообще происходит вызов этой функции? Или может Вы скажете где подробнее можно об этом прочесть? 

Книга Круглински тебе поможет. Ссылки на нее уже давали 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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