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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы: как "организовать" такой код? 
V
    Опции темы
Alca
Дата 14.12.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Ну, ежели нужен велосипед

Можно попробывать 

Вот мои классы, как этот велик приспособить? 
Код

/****************************************************************************
*    класс CXThread
*
*****************************************************************************/

//---------------------------------------------------------------------------
//CXThread.h
class CXThread {
    //...
    
    public:
        VOID   (*vOnExit)();
    
    protected:
        virtual UINT uiOnRun(VOID *pvParam) = 0;
                
    private:
        static UINT WINAPI _s_uiStartFunc(VOID *pvParam);
    
    //...
};
//---------------------------------------------------------------------------
//CXThread.cpp
/*static*/ UINT WINAPI CXThread::_s_uiStartFunc(VOID *pvParam) {
    CXThread *pthThis = static_cast<CXThread *>(pvParam); 
    pthThis->vOnExit(); 
    
    //...
    
    return uiRes;
}
//---------------------------------------------------------------------------


Код

/****************************************************************************
*    класс CXThreadPool
*
*****************************************************************************/

//---------------------------------------------------------------------------
//CXThreadPool.h
#include <XLib/Sync/CXThread.h>
//---------------------------------------------------------------------------
class CXThreadPool : public CXThread {
    //...
    protected:
        virtual UINT uiOnRun    (VOID *pData);    /*overload from CXThread*/
        
    private:
        std::vector<CWorkThread *> _m_vecpthWorkThreads;
        
        VOID _vOnTest(VOID) {
            ::MessageBox(0, _T("Test"), _T(""), MB_OK);
        }        
    //...        
};
//---------------------------------------------------------------------------
//CXThreadPool.cpp
UINT CXThreadPool::uiOnRun(VOID *pData) { 
    //...
    
    CXThreadPool *pthTemp = new CXThreadPool();
    
    _m_vecpthWorkThreads.at(_m_uiCurrTask) = pthTemp;
    _m_vecpthWorkThreads.at(_m_uiCurrTask)->vOnExit  = &CXThreadPool::_vOnTest; /*<<< здесь ругается:
    Error    1    error C2440: '=' : cannot convert from 'void (__thiscall CXThreadPool::* )(void)' to 'void (__cdecl *)(void)'
    */
    _m_vecpthWorkThreads.at(_m_uiCurrTask)->bCreate();
    _m_vecpthWorkThreads.at(_m_uiCurrTask)->bResume();

    _m_uiCurrTask ++;

    //...

    return uiRes;
}
//---------------------------------------------------------------------------



--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 14.12.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну или как с бустом будет?


--------------------
PM WWW ICQ Skype Jabber   Вверх
Леопольд
Дата 14.12.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alca @  14.12.2009,  11:55 Найти цитируемый пост)
Ну или как с бустом будет? 


Код

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>

class Invoker{
    typedef boost::function<void ()> Functor;
    Functor _functor;

public:
    template<typename F>
    void setFunctor(F functor){ // Attention! Transmission by value, and not by reference.
        _functor = functor;
    }
    void invoke(){
        _functor();
    }
};

void plainFunction(){
    std::cout<<"function"<<std::endl;
}


struct Object{
    void foo(){
        std::cout<<"Object::foo"<<std::endl;
    }
};

struct FunctObj{
    void operator()(){
        std::cout<<"FunctObj::operator()"<<std::endl;
    }
};

int main(){
    
    Invoker invoker;

    Object obj;
    invoker.setFunctor( boost::bind(&Object::foo, obj) );
    invoker.invoke();
    
    FunctObj fo;
    invoker.setFunctor(fo);
    invoker.invoke();

    invoker.setFunctor(plainFunction);
    invoker.invoke();

    return 0;
}


Должен предупредить что я не использую boost активно. Функторы вообще первый раз в этом примере. Руководствовался статьёй и немного почитал boost.org

Это сообщение отредактировал(а) Леопольд - 14.12.2009, 14:26


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Alca
Дата 14.12.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Леопольд, спасибо. Буду разбираться.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 14.12.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

boost::function<void (CXThreadPool*)> f;
f = &CXThreadPool::_vOnTest;
///f(this);
_m_vecpthWorkThreads.at(_m_uiCurrTask)->_vOnExit  =  f ;   

Код

Error    1    error C2440: '=' : cannot convert from 'boost::function<Signature>' to 'void (__cdecl *)(void)'

 smile

Добавлено через 2 минуты и 9 секунд
Темный лес  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 14.12.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Решил проблему с помощью Winnie.Closure.


FAQ:
Цитата

- Winnie.Closure
  http://dobrokot.nm.ru/cpp/CppMethodsCallback.html

- Указатели на функции-члены и реализация самых быстрых делегатов на С++.
  http://www.rsdn.ru/article/cpp/fastdelegate.xml
  http://www.codeproject.com/cpp/FastDelegate.asp

- Как сделать callback метод? Почему я не могу присвоить метод указателю на функцию?
  http://www.gamedev.ru/faq/?id=34

- boost::bind
  http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html  

- boost::function
  http://www.boost.org/doc/libs/1_41_0/doc/html/function.html
  http://sources.ru/wiki/doku.php?id=doc:cpp:boost:function
  http://forum.sources.ru/index.php?showtopic=215446

- Better way to call member function using function pointer?
  http://visualcpp.lite-programa.ru/?news=3901

- The Function Pointer Tutorials
  http://www.newty.de/fpt/callback.html  

- Указатели на функцию, коллбэки и функторы
  http://alenacpp.blogspot.com/2007/04/blog-post.html

- Использование функции-члена в качестве аргумента
  http://forums.realcoding.net/index.php?sho...amp;#entry35304

- Передача указателя на функцию-член одного класса в функцию другого класса, ...
  http://forum.sources.ru/index.php?showtopi...mp;view=showall

- Указатели на компоненты класса. Доступ по указателю
  http://www.citforum.ru/programming/cpp_march/cpp_082.shtml

- Указатель на функцию класса 
  http://www.sql.ru/Forum/actualthread.aspx?tid=713636
  http://forum.shelek.ru/index.php/topic,5088.0.html
  http://www.parashift.com/c++-faq-lite/poin...to-members.html
  http://www.rsdn.ru/forum/cpp/1656623.flat.aspx#1656623
  http://forum.sources.ru/index.php?showtopi...mp;view=showall
  http://forum.vingrad.ru/forum/topic-159810.html
  http://www.intuit.ru/department/pl/plintro/11/2.html
  http://forum.codenet.ru/showthread.php?t=40087
  http://www.interface.ru/home.asp?artId=8221
  http://netcode.ru/cpp/?lang=&katID=6&a...4&artID=571
  http://forum.sources.ru/index.php?showtopic=60397
  http://forum.sources.ru/index.php?showtopic=70190
  http://forum.sources.ru/index.php?showtopic=38247
  http://forum.sources.ru/index.php?showtopic=51174
  http://forum.sources.ru/index.php?showtopic=45336
  http://www.sources.ru/cpp/faqs/90.htm
  http://www.gamedev.ru/tip/?id=62
  http://leprecon.pisem.net/faq_213.htm
  http://forum.shelek.ru/index.php/topic,3979.0.html
 http://www.partow.net/programming/template...back/index.html


Это сообщение отредактировал(а) Alca - 5.7.2010, 14:19


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 15.12.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Alca @ 14.12.2009,  15:44)
Код

boost::function<void (CXThreadPool*)> f;
f = &CXThreadPool::_vOnTest;
///f(this);
_m_vecpthWorkThreads.at(_m_uiCurrTask)->_vOnExit  =  f ;   

Код

Error    1    error C2440: '=' : cannot convert from 'boost::function<Signature>' to 'void (__cdecl *)(void)'

 smile

_vOnExit тоже должен быть типа boost::function<void (CXThreadPool*)>, разве не очевидно?  smile 
PM MAIL   Вверх
Alca
Дата 15.12.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

разве не очевидно

xvr, спасибо. C бустом в лоб не сталкивался, поэтому знаниния в этой области поверхностные.
Теперь буду знать.


--------------------
PM WWW ICQ Skype Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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