Preguntas sobre POO en MQL5 - página 37

 
Koldun Zloy:

Todo esto es comprensible. No está claro por quéSetSaveRequired() yGetSaveRequired() no son estáticas, pero escriben en una variable estática.

No lo entiendo, por eso pedí ayuda. Rara vez uso modificadores, operando más como un método intuitivo, pero siempre quiero encontrar la mejor solución

Déjame probarlo en el código, es así

//+------------------------------------------------------------------+
interface IStrategy
{  double      Strategy();
   bool        Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public:
   bool              GetSaveRequired() { return(CStrategy::f_save_required); CStrategy::f_save_required = false;  }
protected:
   static bool       f_save_required;
   double            ProfitStrategy;
   void              SetSaveRequired() { CStrategy::f_save_required = true;                                       }
   void              RunStrategy();
   virtual void      NextStepStrategy();
   void              EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy(void)
{  ProfitStrategy = 0.0;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy(string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public:\
   NAME(SSettingsForOrder &set)  { m_setting = set;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_YYY::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_ZZZ::NextStepStrategy(void) { SetSaveRequired();   //...........     }


publicGetSaveRequired() se utiliza en una clase para gestionar todo este zoo de estrategias

con este patrón sólo escribo el métodoNextStepStrategy - sólo en él cambia para TC, todo lo demás es igual, así que en la clase base CStrategy recojo todos los métodos y todos los campos - no son mucho

ZS: con mi espalda siento que no ace mi código, pero definitivamente funcionará y no creará duplicados de la variablef_save_required;

 
Igor Makanu:

Esto es lo que no entiendo, por eso pedí ayuda. Rara vez uso modificadores, los uso más intuitivamente, pero como siempre quiero la mejor solución

Déjame probarlo en el código, es así


publicGetSaveRequired() se utiliza en una clase para gestionar todo este zoo de estrategias

con este patrón sólo escribo el métodoNextStepStrategy - sólo en él cambia para TC, todo lo demás es igual, así que en la clase base CStrategy recojo todos los métodos y todos los campos - no son mucho

ZS: con mi espalda siento que no as mi código, pero definitivamente funcionará y no creará duplicados de la variablef_save_required;

Yo eliminaría estas funciones por completo.

Todas las funciones que no cambian la estructura, las hacen constantes.

Todas las funciones que no son constantes deben establecer la bandera de escritura.

También añadiría la función Save( int fileHandle ). Esta función debe escribir la estructura y restablecer la bandera.

Puedes hacer una función estática para obtener el estado de la bandera.

if( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 10; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose( fileHandle );
}
 
Koldun Zloy:

Yo eliminaría estas funciones por completo.

Hacer constantes todas las funciones que no cambian la estructura.

Todas las funciones que no son constantes deben establecer la bandera de escritura.

Te digo que tengo problemas con los modificadores en general.


SZY: mientras tanto lo que está pasando en general en la web en la discusión de programación - aquí fue un artículo sobre const en hobber el mes pasado, el significado - este const no es necesario, mira código ensamblador no es diferente sin const - el compilador se llevará todo ((

 
Igor Makanu:

Te digo que tengo problemas con los modificadores en general.

Busqué en Google, leí, algo salió mal otra vez...

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

esperaba obtenerPrint("const") al menos una vez;
 
Igor Makanu:

Busqué en Google, leí, algo salió mal otra vez...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

esperaba obtenerPrint("const") al menos una vez;
class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }
Se trata de una sobrecarga para una clase constante.
 
Vladimir Simakov:
Se trata de una sobrecarga para una clase constante.

Hmmm... cierto, me pasé casi media hora leyendo tanto el hub como los foros, pero no conseguí entenderlo.

¡Gracias! Ahora lo tengo

Todavía existe la sospecha de tal ejemplo:

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  const void f(int v) { x = v; Print("(const) x = v ");  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const


dio los mismos valores, pero el punto es muy diferente? - Entonces necesitas de nuevo la ayuda de la sala.
 
En este momento estoy sentado en una conferencia sobre OOP. Tal vez comparta algo útil contigo )).
Puedo descargar la conferencia actual. Hasta aquí, por supuesto, lo trivial.
 
Nikolai Semko:
Estoy asistiendo a una conferencia sobre OOP en este momento. (Quizás comparta lo que aprenda))
Puedo descargar la conferencia actual. Hasta aquí, por supuesto, lo trivial.

Bueno, lo más probable es que tu conferencia esté en un galimatías, mientras que aquí apenas puedes aprender nada en ruso, has dado vueltas por Internet por tercera vez... la situación general es similar a la de aquí en el foro, no hay más de 10 programadores reales y el resto son frikis

Ok, la situación general se ha aclarado con const, he trabajado con el resto de modificadores, así que he tenido suficiente teoría... Tengo que aplicarlo, pero me siento como un estudiante )))

 
Igor Makanu:

Bueno, lo más probable es que tu conferencia esté en un galimatías, mientras que aquí apenas puedes aprender nada en ruso, has dado vueltas por Internet por tercera vez... la situación general es sombría como aquí en el foro, los programadores reales - no más de 10 personas en el recurso, el resto son geeks

Ok, la situación general se ha aclarado con const, he trabajado con el resto de modificadores, así que tengo mucha teoría ... Me siento como un estudiante ))).

Sí, yo también tengo una situación similar. El aprendizaje no es difícil, es más difícil volver a entrenar, romper los viejos hábitos. Todavía no puedo dejar muchos malos hábitos de la programación procedimental.

 
Igor Makanu:

Me gustaría un ejemplo, ya te digo, no soy nada bueno con los modificadores.


SZY: además en general el horror lo que está pasando en la web en la discusión de programación - aquí fue un artículo sobre const en hobber el mes pasado, el significado - sí, este const no es necesario, mira código ensamblador no difiere que sin const - el compilador eliminará todo (((

Puedes olvidarte de las constantes y la estática por ahora. También en las interfaces.

Y cuando todo esté listo, entonces mira y marca algo como estática y algo como constante. Y puedes olvidarte de las interfaces por completo.