Форум программистов, компьютерный форум CyberForum.ru

Передача указателя функции класса A в класс B - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ абстрактный базовый класс http://www.cyberforum.ru/cpp-beginners/thread161310.html
люди подскажите.есть абстрактный базовый класс можно ли в нем определить конструктор копирования? написал в компиляторе,получается,что можно,но не понимаю почему? если нельзя создавать объект абстрактного класса,то как проходит такое объявление Abk::Abk(const Abk &) ??? Abk-абстрактный базовый класс
C++ Обработка адреса DNS и IP из коммандной строки Имеется ли функция которая исходя из полученного аргумента будет использовать подходяшую функцию? Т.е. если argv == "localhost" то будет использоваться: clientserver.sin_addr.s_addr = inet_addr(argv); а если argv == "127.0.0.1" то: clientserver.sin_addr.s_addr = htons(atoi(argv)); И если нет то каким образом лучше проверить аргумент, по последнему знаку? Т.е. если домейн то последняя будет... http://www.cyberforum.ru/cpp-beginners/thread161305.html
C++ шифрование файлов произвольного типа
возникла проблема при шифровании: txt файлы шифрует нормально но остальные типы(png) не хочет вот код файл SD.h #include <stdio.h> #ifndef __SD #define __SD class SD { public:
Переменная в динамической памяти C++
class SimpleCircle { public: SimpleCircle (); //Basic constructor SimpleCircle (int radius); //Constructor with parameters void SetRadius (int r); //Radius set function void operator++ () {++itsRadius;} int operator++ (int); //Postfix operator int * itsRadius = new int; };
C++ С базовым курсом разобрался, переходим на оконные приложения. http://www.cyberforum.ru/cpp-beginners/thread161238.html
Пол года долбал базовый курс (все о консоли) и считаю что пора перейти на уровень выше. Нашел на майкрософте маленький гайд по созданию оконных приложений. Ниже будет оконное приложение представлено в том гайде которое выводит "Hello world!". Очень прошу помочь разобраться что к чему. В дальнейшем развитии темы выйдет не плохой учебник... // GT_HelloWorldWin32.cpp // compile with:...
C++ самое длинное слово #include <iostream> using namespace std; int main() { char line; int cur = 0, max = 0, index = 0, i; cin >> line; for(i = 0;; i++) { if(line == ' ' || line == '\0') подробнее

Показать сообщение отдельно
djoni-kga
4 / 4 / 0
Регистрация: 11.11.2008
Сообщений: 66
02.09.2010, 12:22  [ТС]     Передача указателя функции класса A в класс B
Братцы помогите!!!!

не получается вызвать функцию по указателю из потока, вроде все сделал как советовали, если вызывать функцию из моего метода куда я предаю указатель, то все работает, но как только дело дошло до потока, меня ждал облом, при попытке вызова, вылетает программа, ругается, что __vfptr равен нулю. Вот урезанный код того, что я делаю:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Прототип для вызывалок. Наследуем от него реальные вызывалки.
class AbstractFunctor 
{
public: 
    // Оператор для вызова
    virtual void operator () (unsigned char* ptr, int arg){ptr = NULL; arg = 0;}
    virtual ~AbstractFunctor() {}
};
 
 
// Создадим функтор для вызова метода объекта произвольного типа. 
// Разумеется, в его составе должен быть метод с требуемой сигнатурой.
// Нам понадобится и ссылка на сам объект.
template <typename T>
class MethodFunctor: public AbstractFunctor
{
public:
  MethodFunctor(T& Host, void (T::*Fun)(unsigned char*, int)): host(Host), fun(Fun) {}
    virtual void operator () (unsigned char* ptr, int arg) {(host.*fun)(ptr, arg);}
private:
    T& host;
    void (T::*fun)(unsigned char*, int);
};
 
// класс работы с портом
class ComPort
{
private:
  // приемный буфер
  unsigned char m_Buffer[256];
 
  // указатель вызова по приёму данных
  AbstractFunctor *m_CallbackRx;
 
  // функция потока приёма данных
  static MyThead(LPVOID lpParameter)
  {
     int  RxCounter = 0;
     ComPort* pThis = static_cast<ComPort*>(lpParameter);
 
     // какой-то код......
     // принимаем данные 
 
     // вызываем callback функцию
     if (pThis->m_CallbackRx != NULL)
     {
       // передаем указатель на буфер и сколько приняли байт
       // вот здесь меня жал облом
       pThis->m_CallbackRx->operator ()(m_Buffer, RxCounter);
     }
  }
public:
  // прикрепить callback-функцию вызова по приходу данных в буфер
  void SetCallbackRx(AbstractFunctor *callback)
  {
    m_CallbackRx = callback;
    // здесь я проверял что вызов работает
    // m_CallbackRx->operator ()(NULL, 1000);
  }
  
  // открыть порт
  void Open()
  { 
    // код
  }
};
 
// настройка порта и обработка данных
class TestPort
{
   // открытие порта
   void Open()
   {
      comPort.SetCallbackRx(&MethodFunctor<TestPort>(*this, &TestPort::MyMethod));
      comPort.Open();
   }
   // обработка данных
   void CComPortView::MyMethod(unsigned char* ptr, int count)
  {
  }
};
а вот что я вижу в дебаге:
Миниатюры
Передача указателя функции класса A в класс B  
 
Текущее время: 22:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru