Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1096

 

Как создать указатель на метод класса?

class qer{
public:
int _int(int q){...}
int int_(int q){...}
};qer *_qer

Нужно создать указатель на функцию _int и int_.

В mql4 что-то описано про указатели и классы здесь (https://docs.mql4.com/ru/basis/types/this,https://docs.mql4.com/ru/basis/types/object_pointers,https://docs.mql4.com/ru/common/getpointer) но нет никаких комментариев, не понятно для чего это и что оно делает. Без классов объявить указатель с помощью typedef  не составляет труда, но хотелось бы разобраться как это работает в классах.

Пробую применить typedef  для функции класса  выбивается ошибка pointer to this function type is not supported yet, пробовал инструкции выше но т.к. не показано для чего и нет комментариев ничего у меня не получилось.
 
Seric29:

Как создать указатель на метод класса?

Нужно создать указатель на функцию _int и int_.

В mql4 что-то описано про указатели и классы здесь (https://docs.mql4.com/ru/basis/types/this,https://docs.mql4.com/ru/basis/types/object_pointers,https://docs.mql4.com/ru/common/getpointer) но нет никаких комментариев, не понятно для чего это и что оно делает. Без классов объявить указатель с помощью typedef  не составляет труда, но хотелось бы разобраться как это работает в классах.

Пробую применить typedef  для функции класса  выбивается ошибка pointer to this function type is not supported yet, пробовал инструкции выше но т.к. не показано для чего и нет комментариев ничего у меня не получилось.
Нельзя
 
 
Не то. Человеку нужен указатель на метод класса, а не приведение к наследнику.
 
Vladimir Simakov:
Не то. Человеку нужен указатель на метод класса, а не приведение к наследнику.

другого не дано - или процедурный стиль без разграничения доступа или ООП с контролем доступа и типов

ладно, не важно у автора всегда проблемы узкоспециализированные ;)

 
Seric29:

Как создать указатель на метод класса?

Нужно создать указатель на функцию _int и int_.

В mql4 что-то описано про указатели и классы здесь (https://docs.mql4.com/ru/basis/types/this,https://docs.mql4.com/ru/basis/types/object_pointers,https://docs.mql4.com/ru/common/getpointer) но нет никаких комментариев, не понятно для чего это и что оно делает. Без классов объявить указатель с помощью typedef  не составляет труда, но хотелось бы разобраться как это работает в классах.

Пробую применить typedef  для функции класса  выбивается ошибка pointer to this function type is not supported yet, пробовал инструкции выше но т.к. не показано для чего и нет комментариев ничего у меня не получилось.

Просто интересно: как Вы его планируете использовать?

 

Для чего нужно сохранять указатель на весь класс вот пример https://docs.mql4.com/ru/basis/types/this

//+------------------------------------------------------------------+
//| возвращает собственный указатель                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Что с ним делать потом?

 
Vladimir Simakov:
Нельзя

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

 
Seric29:

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

Это как?

 
Vladimir Simakov:

Это как?

В качестве параметра передаётся указатель на функцию. Я вижу с классами никто не разобрался как это делать. Мне также до сих пор непонятно зачем нужно возвращать указатель на класс что это даёт.

Вот интересные примеры но это не по моему вопросу

#property strict

class CStrategy;
typedef bool (*SignalFn)(CStrategy*);

// Global function definitions
bool IsBuySignal(CStrategy*ptr) { return ptr.IsBuySignal(); }
bool IsSellSignal(CStrategy*ptr) { return ptr.IsSellSignal(); }

// Create an abstract base class
class CStrategy
{
public:
        virtual bool IsBuySignal(void)=0;
        virtual bool IsSellSignal(void)=0;
};

// Derived class
class Strat1 : public CStrategy
{
public:
        // Implement the required functions
        bool IsBuySignal(void) { return true;}
        bool IsSellSignal(void) { return true;}
};

void OnStart()
{
        // instantiate a class
        Strat1 strat1;

        // Global functions work as expected
        SignalFn ptrSignalFn;                           // pointer to a signal function
        ptrSignalFn = IsBuySignal;
        if ( ptrSignalFn(&strat1) ) { Print("Is Buy"); }
}
Также в справочнике видел что-то похожее но по закрывал уже эти сайты т.к. руки болят да и работу нужно делать.
Причина обращения: