MQL5中的OOP问题 - 页 41

 
Igor Makanu:

看了看我与OOP风格的代码斗争的结果--嗯......。优秀的!))))


我有一个问题,但在我的代码中,嗯,确切地说,有三次,我使用了这样的结构。

所有的调用都在私有方法中,但是在源代码中是否有一个 "绝地方法?"来摆脱CheckPointer(m_order)==POINTER_INVALID的困扰?

我问的是一些获取/设置

没有特别的问题,但可以说是心血来潮,或者说在对C++中的OOP方法的渴求还没有减弱的时候

如果问题是 "许多字母",那么!CheckPointer(mPtr),如果函数调用,你在构造函数中将所有指针初始化为NULL,并在代码中与之比较,删除ptr时不要忘记;ptr=NULL。

 
Igor Makanu:

看了看我与OOP风格的代码斗争的结果--嗯......。优秀的!))))


我有一个问题,但在我的代码中,嗯,确切地说,有三次,我使用了这样的结构。

所有的调用都在私有方法中,但是在源代码中是否有一个 "绝地方法?"来摆脱CheckPointer(m_order)==POINTER_INVALID的困扰?

我问的是一些获取/设置

没有特别的问题,但可以说是心血来潮,或者说在对C++中的OOP方法的渴求还没有减弱的时候


伊戈尔,看看这个例子,我想这就是你要问的。

 
Vladimir Simakov:

如果问题是 "许多字母",那么!CheckPointer(mPtr),如果在一个函数调用 中,你在构造函数中将所有指针初始化为NULL,并在代码中与之比较,不要忘记在删除ptr时;ptr=NULL。

嗯,还有这个,用来装糖。

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

没有特别的问题,但可以说是心血来潮,或者说趁着学习C++中的OOP方法的渴求还没有消退。

我强烈建议你在构造函数中用默认值初始化类的所有字段。关键是,如果你想这样做。

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

没有人将初始化你的类的字段,而且会有垃圾值。

 
Vladimir Simakov:

而这个,是为了糖。

不,我几乎已经放弃了定义,我只是不想包装任何东西,正如我几周前写的那样--我想暂时看到纯OOP风格的代码,评估灵活性和可能性

HH:我只是在创建时用define包装了后裔,而不是在3行上写同样的初始化,这样以后添加方法就更容易了,也就是说,到目前为止在源代码中只有一行。

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
罗马 人。


伊戈尔,看一下这个例子,我想这就是你要问的。

不,我指的是c#中的等价物--操作符?(null-join操作符),我想在C++风格的逻辑中看到类似的东西


UPD。

弗拉基米尔-西马科夫

我强烈建议在构造函数中用默认值初始化一个类的所有字段。关键是,如果你想做

如果你要求的是一个宏,没有人会初始化你的类的字段,而且会有垃圾值。

这就是我所做的,构造函数初始化基类中的任何东西,子类初始化基类。

这就是我把它包装在一个宏中的原因,这样我就不会忘记正确地初始化))))。

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

不,我几乎已经放弃了定义,我只是不想包装任何东西,正如我几周前写的那样--我想暂时看到纯OOP风格的代码,评估灵活性和可能性

ZS:在创建时只在定义中包装后裔,不要在3行上写同样的初始化,以后添加方法更容易,即在源代码中暂时只写一行。

不,我指的是c#中的等价物--操作符?(null-join操作符),我想看到类似于C++风格的逻辑的东西

预处理程序是浪费时间的。与模板一起,它们是最强大的工具。似乎没有类似于"?"的运算符。在这方面,C++是比较硬核的。
 
Vladimir Simakov:
你对预处理程序的拒绝是徒劳的。与模板一起,它们是最强大的工具。似乎没有类似于"?"的运算符。在这方面,C++是比较硬核的。

我还在为纯粹的OOP风格而战斗,我想学习所有的OOP技术,同时在论坛上有一个资产;)

我已经掌握了预处理程序的速度,但...我想我不应该滥用它,至少,不是我的风格,我可能会搞砸,而且我肯定无法阅读有多个宏替换的代码,如何寻找bug......嗯,这更容易重写--所以,还没有必要


模板...好吧,我不喜欢开发商在SB中提供的东西,我都看了一遍,很难说他们被纳入SB的目的是什么,也许他们的时代还没有到来。

关于C++模板移植到MQL - 现在是时候了,正如讨论所显示的,在大多数情况下,C++模板需要为MQL进行微调 - 回到.dll更容易,不用麻烦MQL ))))。

 
Igor Makanu:

我还在为纯粹的OOP风格而战斗,我想学习所有的OOP技术,同时在论坛上有一个资产;)

我已经掌握了预处理程序的速度,但...我想我不应该滥用它,至少,不是我的风格,我可能会搞砸,而且我肯定无法阅读有多个宏替换的代码,如何寻找bug......嗯,这更容易重写--所以,还没有必要


模板...好吧,我不喜欢开发商在SB中提供的东西,我都看了一遍,很难说他们被纳入SB的目的是什么,也许他们的时代还没有到来。

关于C++模板移植到MQL - 现在是时候了,正如讨论所显示的,在大多数情况下,C++模板需要为MQL进行微调 - 回到.dll更容易,不用麻烦MQL ))))。

你可以这样写你自己的模板))。
 
Vladimir Simakov:
这样你就可以自己写模板了))))。

Yup ))))

我已经看完了帮助,跳过了覆盖,感谢上帝,所有的东西都在宏中,编辑,嗯,正是在一个复制粘贴中

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD。

不是的,是为权限控制本身准备的,不需要公开的方法。

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

然后还有这个,是为了糖。

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

我想写下我曾经拥有的东西,而不是

if( CheckPointer(m_order)==POINTER_INVALID )

它是这样的。

if(m_order==NULL)

但记得如何在MQL中检查宏替换的问题

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID= 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


如果我没记错的话,在年初的时候,可以把NULL解压到日志中,得到0,现在出现了一个错误

也就是说,NULL的行为在未来不应该改变,但是用什么来代替NULL就不清楚了,可能如果现在检查这种情况,就像写的if(CheckPointer(m_order)==POINTER_INVALID)),可以 说是正确的代码)