新人对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应用于一个类的函数,得到一个错误的指针,这个函数类型还不支持,尝试了上面的说明,但因为没有显示什么,也没有注释,所以什么都没有用。
 
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应用于一个类函数,错误的是这个函数类型的指针还不支持,尝试了上面的说明,但由于没有显示它的用途,也没有注释,所以没有任何效果。
不能
 
 
错了。一个人需要一个指向类方法的指针,而不是一个后裔转换。
 
Vladimir Simakov:
错了。一个人需要一个指向一个类的方法的指针,而不是指向一个继承者的指针。

没有别的办法,要么是没有访问控制的程序式,要么是有访问和类型控制的OOP。

好吧,别介意,作者总是有高度专业化的问题;)

 
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应用于一个类的函数,得到一个错误的指针,这个函数类型还不支持,尝试了上面的指示,但因为没有显示什么,也没有注释,所以什么都没有用。

只是想知道:你打算如何使用它?

 

为什么你需要保存整个类的指针,这里有一个例子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"); }
}
我在指南中也看到了类似的东西,但我已经关闭了这些网站,因为我的手受伤了,我还有工作要做。
原因: