Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос от нюба  (Прочитано 7676 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 15-11-2011 15:56 » new

Вот в этом случае всё отлично :
Код:

typedef void(*pCallback)(void);


class CClass
{
private:
explicit CClass(void);

public:
~CClass()
{
m_pInstance = NULL;
}

static CClass* GetInstance()
{
if (!m_pInstance)
        {
m_pInstance = new CClass();
        }
return m_pInstance;
}

private:

       void _set(pCallback callback)
{
m_callback = callback;
}

      void _check()
      {
           GetInstance()->_set(&CClass::GetInstance()->set_reload);
      }


private:
void static set_reload(void)
{
if(m_bReload == false)
{
m_bReload = true;
}
}

private:
static CClass* m_pInstance;

private:
bool static m_bReload;
};

Но стоит убрать объявление static в m_bReload и set_reload,как компилятор начинает ругаться illegal operation on bound member function :

Код:

typedef void(*pCallback)(void);


class CClass
{
private:
explicit CClass(void);

public:
~CClass()
{
m_pInstance = NULL;
}

static CClass* GetInstance()
{
if (!m_pInstance)
        {
m_pInstance = new CClass();
        }
return m_pInstance;
}

private:

       void _set(pCallback callback)
{
m_callback = callback;
}

      void _check()
      {
           GetInstance()->_set(&CClass::GetInstance()->set_reload);  <- Error illegal operation on bound member function
      }

private:
void set_reload(void)
{
if(m_bReload == false)
{
m_bReload = true;
}
}

private:
static CClass* m_pInstance;

private:
bool m_bReload;
};

Это потому что CClass - singletone (static CClass* m_pInstance)?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 15-11-2011 16:36 » 

Потому что в обычный метод класса при вызове  неявно передается this экземпляра класса. Получается твоя callback функция не соответсвует шаблону.

Добавлено через 2 минуты и 55 секунд:
Код:
               if(m_bReload == false)
{
m_bReload = true;
}

Это кстати мошно.
« Последнее редактирование: 15-11-2011 16:39 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
AlexCasual
Помогающий

by
Offline Offline

« Ответ #2 : 17-11-2011 13:13 » 

То есть необходимо объявить указатель  pCallback,как указатель на метод класса? Или здесь только можно использовать static методы?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 17-11-2011 13:43 » 

AlexCasual, а каков смысл всей конструкции? Если ты хочешь позволять вообще любой callback устанавливать, а не только методы данного класса, то - только статик. Но могут быть и другие варианты.
Поэтому, давай ты сначала расскажешь, какая задача решается Улыбаюсь
Записан
DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #4 : 17-11-2011 14:05 » 

AlexCasual,
Код:
private:
static CClass* m_pInstance;
вопрос "интеллектуала". На все реализации класса будет один указатель ?
« Последнее редактирование: 17-11-2011 14:06 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 17-11-2011 19:05 » 

DneprSMV, Он вояет паттерн Singleton. В такой конструкции не получится создать экземпляр класса в обход GetInstance.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
AlexCasual
Помогающий

by
Offline Offline

« Ответ #6 : 18-11-2011 10:23 » 

Вад,методы наследников собираюсь устанавливать...
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-11-2011 10:56 » 

Вад,методы наследников собираюсь устанавливать...
А зачем? Почему это не решается, например, виртуальными методами? Если не решается - к чему вообще наследование, коли поведение не полиморфное?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines