Perguntas sobre OOP em MQL5 - página 95

 
Maxim Kuznetsov:

a AG é mais uma coisa de "palavra-chave". Como o código de Gray pode ajudar a convergência? Só teoricamente...

mais vale embaralhar aleatoriamente

não estou dizendo nada, não acredito em tudo o que está escrito na internet por muito tempo, tento verificar tudo

aqui está um código de conversão funcional para o código de Gray e de volta

//+------------------------------------------------------------------+
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);
  }
//+------------------------------------------------------------------+
 
E como isso afetaria o algoritmo genético? O algoritmo genético não deve responder a valores se for puramente genético. Se for utilizada alguma descida média ou gradiente adicional, isso pode afetá-la. Mas neste caso é melhor resolver o problema de uma maneira direta - filtrar o parâmetro através da matriz e embaralhar a matriz. O valor do parâmetro otimizado da janela de propriedades é um índice do elemento da matriz, e o valor da matriz será usado no próprio Expert Advisor. Então, o otimizador pode ser enganado. Mas somente se a convergência ocorrer devido a uma descida média ou gradiente. Mas se for um algoritmo genético puro, não consigo imaginar o bem que ele fará. Qual é o objetivo? De onde crescem as pernas?
 

existe este código:

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
}
//+------------------------------------------------------------------+

está tudo bem, mas preciso de uma série de objetos A, ou seja, preciso assim:

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
};

existe alguma forma de chamar um construtor para uma série de objetos sem usar ponteiros?

 
Igor Makanu:

existe este código:

está tudo bem, mas preciso de uma série de objetos A, ou seja, preciso assim:

existe alguma forma de chamar um construtor para uma série de objetos sem usar ponteiros?

Não. Somente através de muletas.
 

É possível este código:

//+------------------------------------------------------------------+
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
}
//+------------------------------------------------------------------+

para LIST para fazer um modelo / modelo ?

Não funcionou da primeira vez (((.

 
Igor Makanu:

É possível este código:

para LIST para fazer um modelo / modelo ?

não funcionou da primeira vez ((.

isto. remover

UPD: hmm... você já tem tudo resolvido))))

UPD: obtenha o 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:

isto. remover

UPD: hmmm... você já tem tudo resolvido))))

UPD: pegue o yum-yum))))

Obrigado! - funciona!

o código é minimalista, funciona - quero um conjunto de estruturas, as listas nem sempre são convenientes, tudo funciona, é claro que situações não padronizadas usando este código podem ser simuladas, mas o código uma dúzia de linhas

 

porque este código não dá um erro de compilador ao acessar o campo privado de outra pessoa:

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
}
//+------------------------------------------------------------------+
 
é seu próprio campo privado
 
Andrei Trukhanovich:
este é seu próprio campo privado

OK, obrigado!

Mas se uma classe derivada em uma classe pai muda de campo privado da mesma forma, é "legal"?

ou seja, de forma semelhante:

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