MQL5中的OOP问题 - 页 90

 
Igor Makanu:

如果在我的例子中。

在onTick()方法中复制asc和bid值,并在其余方法中使用_Ask, _Bid(虚拟交易)。

是否会像使用全局变量一样工作?

ZS: 作为一种选择,我当然可以通过引用&tick来传递给所有的方法,但同样的问题是哪个更有效

如果这个话题仍有意义的话,我想指出,保留字段的选项在效率上和概念上都是不太正确的。 原则上,这两个概念几乎总是相关的。
干净的代码(没有副作用)总是能被编译器更好地优化,而且更容易理解。
如果你的对象是为了在输入数据的影响下改变其状态,那么它就不应该存储这些输入数据(除了用于缓存)。
你必须把苍蝇和肉片分开。

 

曾经问过一个问题,在一个类中初始化变量 的两种方法。这一个。

class CA{
   protected:
      int val;
   public:
      CA(){
         val=0;
      }      
};

还有这个。

class CA{
   protected:
      int val;
   public:
      CA():val(0){
      }      
};

我问第二种方式有什么好处,有人告诉我,你可以用它来初始化静态成员。但静态成员不是这样初始化的。

所以问题是一样的--原理上有什么不同,第二种方式的优势是什么?

 

引用

Хочется закончить свою песнь важными словами. Любые описанные механизмы, принципы и паттерны, как и ООП в целом не стоит применять там, где это бессмысленно или может навредить. Это ведет к появлению статей со странными заголовками типа «Наследование — причина преждевременного старения» или «Синглтон может приводить к онкологическим заболеваниям».
 
Dmitry Fedoseev:

曾经问过一个问题,在一个类中初始化变量 的两种方法。这里有一个这样的例子。

https://www.mql5.com/ru/forum/85652/page45#comment_15975127

Dmitry Fedoseev:

我问第二种方式有什么好处,有人告诉我,静态成员可以用它来初始化。但静态成员不是这样初始化的。

它们是恒定的 领域,而不是静态 的领域。

class CA
{
protected:
   const int         val;
   static int        static_val;
public:
                     CA(): val(0) { }
};
static int CA::static_val = 12345;
Dmitry Fedoseev:

所以问题还是一样的--原则性的区别是什么,第二种方式的优势是什么?

如果我们抛弃 "它被认为是不好的形式 "的说法,那么无论什么更方便,这就是我们要用的,我认为。

 
是的,这是正确的,不断的,混乱的)
 

我将再次启动这个话题,我删除了之前的帖子,我想我自己已经想通了....。


这里是代码。

class CSetting  
{
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const int in_param1,const int in_param2,const T in_t,const D in_d,const V in_v)
   : param1(in_param1),
     param2(in_param2),
     t(in_t),
     d(in_d),
     v(in_v)
  {}

//--- input parameters
input int              Input_p1 = 1;   // p1 = -1000 ... +1000
input int              Input_p2 = 2;   // p2 = -1000 ... +1000
input CSetting::T      Input_T = CSetting::T::T1;
input CSetting::D      Input_D = CSetting::D::D1;
input CSetting::V      Input_V = CSetting::V::V1;

我想从CSetting的privat部分的3个枚举和2个int中填入一个int,我将在其中一点一点地存储这些数据,草拟了代码。

class CSetting
  {
public:
   enum T            {T1, T2, T3, T4, T5, T6, T7, T8};
   enum D            {D1, D2, D3, D4, D5, D6, D7, D8};
   enum V            {V1, V2, V3, v4};
private:
   int               param1, param2;
   T                 t;
   D                 d;
   V                 v;
public:
                     CSetting(const uint data);
  };
//+------------------------------------------------------------------+
CSetting::CSetting(const uint data)
{
   v = (V)(data & 0x3);
   d = (D)((data >> 2) & 0x7);
   t = (T)((data >> 5) & 0x7);
   uint tmp = ((data >> 8) & 0xFFF);
   param2 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
   tmp = data >> 20;
   param1 = (tmp & 0x800) == 0x800 ? -(int)(tmp & 0x7FF) : (int)(tmp & 0x7FF);
}
//+------------------------------------------------------------------+
//--- input parameters
input int DATA         = 0xFFFFFFFF;

理论上,它应该是可行的,我从枚举数据中抽取低2+3+3位,从int中抽取剩余的24位来填充param1和param2,保持第12位作为数字的字符。


我如何检查是否有错误?)))

或感谢别人的想法,如何将这些数据保存到int

 
或者:T+D*10+V*100
 
Igor Makanu:

你如何检查是否有错误?)))

通常的方法是--打包,拆包,检查是否相同。最好是检查所有边界的情况。
 
Dmitry Fedoseev:
或t+d*10+v*100

这是不可能的。

你必须逐位移位或乘/分2,这相当于移位

TheXpert:
很好,像往常一样--打包,拆包,检查身份。最好是检查所有的边界案件。

所以,是的...在逻辑上

但我并不打算做包装--我正在减少优化器的输入变量数量,我需要在这些变量上进行许多GA传递,这样GA就不会迅速收敛。


边界案例已经检查过了,但从经验来看....虫子太狡猾了!!。)))

HH:我当然可以把从0...MAX_UINT的循环重置到一个文件里,然后直观地看一下,但不是最好的选择,我想。

 
Igor Makanu:

它不会工作。

...

为什么不工作呢?三个数,都不超过10。 小学二年级的算术题。