Вопросы по ООП в MQL5 - страница 95

 
Maxim Kuznetsov:

про ГА скорее "для красного словца". Ну вот как код Грея может помочь сходимости ? вот просто теоретически...

с тем-же успехом можно случайно-перемешивать

ничего не скажу, давно не верю всему, что пишут в интернете, все стараюсь проверять

вот работающие коды преобразования в код Грея и обратно

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

все ОК, но мне нужно массив обьктов А, т.е. нужно так:

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:

есть такой код:

все ОК, но мне нужно массив обьктов А, т.е. нужно так:

есть ли возможность вызвать для массива обьектов конструтор без применения указателей?

Нет. Только через костыли.
 

возможно ли для этого кода:

//+------------------------------------------------------------------+
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 сделать шаблон / template ?  

с первого раза что то не получилось (((

 
Igor Makanu:

возможно ли для этого кода:

для LIST сделать шаблон / template ?  

с первого раза что то не получилось (((

this. убери

UPD: хм... ну ты и замудрил)))

UPD: лови нямку)))

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

this. убери

UPD: хм... ну ты и замудрил)))

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)
Причина обращения: