MQL5中的OOP问题 - 页 95

 
Maxim Kuznetsov:

GA更像是一个 "流行语 "的东西。格雷的代码如何帮助收敛? 只是理论上...

你还不如直接随机洗牌呢

我没有说什么,我不相信互联网上写的一切,很长一段时间,我试图检查一切

这里有一个有效的转换代码,可以转换到格雷的代码,然后再转换回来

//+------------------------------------------------------------------+
uint IntToGrey(const uint value) // https://e-maxx.ru/algo/gray_code
  {  return(value ^ (value >> 1)); }
//+------------------------------------------------------------------+
uint GreyToInt(const uint value) // https://e-maxx.ru/algo/gray_code
  {
   uint n = 0;
   for(uint g = value; g != 0; g >>= 1)
     {
      n ^= g;
     }
   return(n);
  }
//+------------------------------------------------------------------+
 
这又会对遗传算法 产生什么影响呢?遗传算法如果是纯粹的遗传,就不应该对数值作出反应。如果使用了一些额外的平均法或梯度下降法,可能会影响它。但在这种情况下,最好以直接的方式解决问题--通过数组过滤参数,并对数组进行洗牌。来自属性窗口的优化参数的值是数组元素的索引,数组中的值将在专家顾问本身中使用。那么优化器就可以被欺骗了。但只有在由于平均化或梯度下降而发生收敛的情况下。但如果它是一个纯粹的遗传算法,我无法想象它能带来什么好处。这有什么意义?腿是从哪里长出来的?
 

有这样的代码。

class A
{
private:
   const int _a;
public:
   A(const int a): _a(a) { Print(_a); }
};
//+------------------------------------------------------------------+
class B
{
private:
   const A a;
public:
   B(const int b): a(b) {}
};
//+------------------------------------------------------------------+
void OnStart()
{
   B b(3);// 3
}
//+------------------------------------------------------------------+

一切正常,但我需要一个A对象的数组,即我需要这样的数组。

class B
{
private:
   const A a[2];
public:
   B(const int b): a[0](b),a[1](b) {}  //'[' - member(s) initialization expected
                                       // 'a' - explicit initializer for arrays not allowed
};

有什么方法可以在不使用指针的情况下为一个数组对象调用构造函数吗?

 
Igor Makanu:

有这样的代码。

一切正常,但我需要一个A对象的数组,即我需要这样的数组。

有什么方法可以在不使用指针的情况下为一个数组对象调用构造函数吗?

不,只能通过拐杖。
 

这个代码是否可能。

//+------------------------------------------------------------------+
struct LIST;
struct MyStruct
{
   double            d_data;
   int               i_data;
   MyStruct() {}
   MyStruct(const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST              operator+(MyStruct &value)
   {
      LIST result;
      ArrayResize(result.arr, 2, 10);
      result.arr[0] = this;
      result.arr[1] = value;
      return(result);
   }
   MyStruct          operator*(const double mult)
   {
      MyStruct result = this;
      result.d_data *= mult;
      return(result);
   }
};
//+------------------------------------------------------------------+
struct LIST
{
   MyStruct          arr[];
   LIST              operator+(MyStruct &value)
   {
      int last = ArraySize(this.arr);
      ArrayResize(this.arr, last + 1, 10);
      this.arr[last] = value;
      return(this);
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   MyStruct a(1, 1.11), b(2, 2.22), c(3, 3.33);
   LIST x = a + b + c * 2;
   ArrayPrint(x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
//+------------------------------------------------------------------+

LIST做一个模板/模版?

第一次没有成功(())。

 
Igor Makanu:

这个代码是否可能。

LIST做一个模板/模版?

第一次没有成功()。

这一点。

UPD: hmm...你已经明白了))))

UPD: 获取yum))))

//+------------------------------------------------------------------+
template<typename T>
struct LIST
{
   T          arr[];
   LIST<T>              operator+(T &value)
   {
      int last = ArraySize(arr);
      ArrayResize(arr, last + 1, 10);
      arr[last] = value;
      return(this);
   }
};
//+------------------------------------------------------------------+
struct MyStruct
{
   double            d_data;
   int               i_data;
   MyStruct() {}
   MyStruct(const int i_v, const double d_v): d_data(d_v), i_data(i_v) {}
   LIST<MyStruct>              operator+(MyStruct &value)
   {
      LIST<MyStruct> result;
      ArrayResize(result.arr, 2, 10);
      result.arr[0] = this;
      result.arr[1] = value;
      return(result);
   }
   MyStruct          operator*(const double mult)
   {
      MyStruct result = this;
      result.d_data *= mult;
      return(result);
   }
};
//+------------------------------------------------------------------+
void OnStart()
{
   MyStruct a(1, 1.11), b(2, 2.22), c(3, 3.33);
   LIST<MyStruct> x = a + b + c * 2;
   ArrayPrint(x.arr);
//    [d_data] [i_data]
//[0]  1.11000        1
//[1]  2.22000        2
//[2]  6.66000        3
}
 
Vladimir Simakov:

这一点。

UPD: hmmm...你已经明白了))))

UPD: 捕捉到了百胜的气息)))

谢谢!- 它的工作原理!

代码很简约,它的工作原理是--我想要一个结构数组,列表并不总是方便的,一切都在工作,很明显,使用这个代码可以模拟非标准的情况,但代码有十几行

 

为什么这段代码在访问别人的私有字段时 不会出现编译器错误。

class A
{
private:
   int _value;
public:
  void set(const int value)      { _value = value;    }
  int  get()                     { return(_value);    }
  void set(A &a, const int value){ a._value = value;  }
};

void OnStart()
{
  A x,y;
  x.set(10);
  y.set(20);
  Print("x = ",x.get());   // 10
  Print("y = ",y.get());   // 20
  y.set(x,777);
  Print("x = ",x.get());   // 777
  Print("y = ",y.get());   // 20
}
//+------------------------------------------------------------------+
 
是它自己的私有字段
 
Andrei Trukhanovich:
这是它自己的私人领域

好的,谢谢!

但是如果一个父类中的派生类 以同样的方式改变私有字段,这是否 "合法"?

即以类似的方式。

class B: private A
{
        A a;
        void setA(A &obj, const int value) { a.set(obj,value); }
}
....
A x;
B y;
y.(x.55)