Preguntas sobre POO en MQL5 - página 41

 
Igor Makanu:

miré los resultados de mi batalla con el código de estilo OOP - hmmm... ¡excelente! ))))


Tengo una pregunta, pero en mi código, bueno, tres veces exactamente, uso una construcción como:

llama a todo en métodos privados, pero ¿hay un "método Jedi" para escapar en el código fuente de CheckPointer(m_order)==POINTER_INVALID

Pregunto por algún get / set

ningún problema especial, sino por así decirlo un capricho, o mientras que la sed de conocimiento de los métodos de POO en C++ aún no ha disminuido

Si la pregunta es "muchas letras", entonces !CheckPointer(mPtr), y si la llamada a la función, se inicializan todos los punteros a NULL en el constructor y se comparan con él en el código, sin olvidar al borrar ptr; ptr=NULL;

 
Igor Makanu:

miré los resultados de mi batalla con el código de estilo OOP - hmmm... ¡excelente! ))))


Tengo una pregunta, pero en mi código, bueno, tres veces exactamente, uso una construcción como:

llama a todo en métodos privados, pero ¿hay un "método Jedi" para escapar en el código fuente de CheckPointer(m_order)==POINTER_INVALID

Pregunto por algún get / set

ningún problema especial, sino por así decirlo un capricho, o mientras que la sed de conocimiento de los métodos de POO en C++ aún no ha disminuido


Igor, mira este ejemplo, creo que es lo que preguntas.

 
Vladimir Simakov:

Si la pregunta es "muchas letras", entonces !CheckPointer(mPtr), y si en una llamada a una función, se inicializan todos los punteros a NULL en el constructor y se comparan con él en el código, sin olvidar al borrar ptr; ptr=NULL;

Bueno y esto, para el azúcar:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

No hay problemas especiales, pero por así decirlo un capricho, o mientras la sed de aprender métodos OOP en C++ no se ha apagado todavía.

Te recomiendo que inicialices todos los campos de la clase con valores por defecto en el constructor. La cuestión es que si quieres hacer esto:

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

nadie inicializará los campos de tu clase y habrá valores basura.

 
Vladimir Simakov:

Y esto, por el azúcar:

No, casi he renunciado a las definiciones, simplemente no quiero envolver nada, como escribí hace un par de semanas - quiero ver código puro estilo OOP por ahora, evaluar la flexibilidad y las posibilidades

HH: Acabo de envolver los descendientes en define en la creación, para no escribir la misma inicialización en 3 líneas, es más fácil añadir métodos más tarde, es decir, en el código fuente en una línea hasta ahora

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
Romano:


Igor, mira este ejemplo, creo que es lo que preguntas.

no, me refiero al equivalente en c# - operador ? ( operador null-join ), algo similar en la lógica que quiero ver en el estilo C++


UPD:

Vladimir Simakov:

Recomiendo encarecidamente inicializar todos los campos de una clase con valores por defecto en el constructor. La cuestión es que si quieres hacer esto:

Si pides una macro, nadie inicializará los campos de tu clase y habrá valores basura.

eso es lo que hice, constructor con inicialización de cualquier cosa y todo en la clase base, los descendientes inicializan la clase base:

eso es exactamente lo que envolví en una macro, para no olvidarme de inicializar correctamente ))))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

No, casi he renunciado a las definiciones, simplemente no quiero envolver nada, como escribí hace un par de semanas - quiero ver código puro estilo OOP por ahora, evaluar la flexibilidad y las posibilidades

ZS: sólo envolver descendientes en definir en la creación, no escribir la misma inicialización en 3 líneas, es más fácil añadir métodos más tarde, es decir, en el código fuente en una línea hasta ahora

no, me refiero al equivalente en c# - operador ? ( operador null-join ), quiero ver algo similar en la lógica al estilo de C++

El preprocesador es una pérdida de tiempo. Junto con las plantillas, son las herramientas más potentes. No parece haber un análogo del operador ? C++ es más duro en este sentido.
 
Vladimir Simakov:
Su rechazo al preprocesador es en vano. Junto con las plantillas son las herramientas más potentes. No parece haber un análogo del operador ? C++ es más duro en este sentido.

Sigo en una batalla por el estilo OOP puro, quiero aprender todas las técnicas OOP, mientras haya un activo en el foro ;)

Estoy al día con el preprocesador, pero ... Creo que no debo abusar, al menos, no es mi estilo, puedo meter la pata, y ciertamente no seré capaz de leer código con múltiples macrosustituciones, y como buscar errores... bueno, es más fácil reescribir - así que, no es necesario todavía


plantillas... Bueno, no me gusta lo que ofrecen los desarrolladores en SB, los he revisado todos, es difícil decir con qué propósito se incluyeron en SB, tal vez no ha llegado su momento

sobre la portación de plantillas C++ a MQL - es el momento, como la discusión mostró, que en la mayoría de los casos las plantillas C++ requieren un ajuste fino para MQL - es más fácil volver a .dll y no molestar a MQL ))))

 
Igor Makanu:

Sigo en una batalla por el estilo OOP puro, quiero aprender todas las técnicas OOP, mientras haya un activo en el foro ;)

Estoy al día con el preprocesador, pero ... Creo que no debo abusar, al menos, no es mi estilo, puedo meter la pata, y ciertamente no seré capaz de leer código con múltiples macrosustituciones, y como buscar errores... bueno, es más fácil reescribir - así que, no es necesario todavía


plantillas... Bueno, no me gusta lo que ofrecen los desarrolladores en SB, los he revisado todos, es difícil decir con qué propósito se incluyeron en SB, tal vez no ha llegado su momento

sobre la portación de plantillas C++ a MQL - es el momento, como la discusión mostró, que en la mayoría de los casos las plantillas C++ requieren un ajuste fino para MQL - es más fácil volver a .dll y no molestar a MQL ))))

Así puedes escribir tus propias plantillas)).
 
Vladimir Simakov:
Usted mismo puede escribir las plantillas de esa manera))).

Yup ))))

He terminado de leer la ayuda y me he saltado el override, menos mal que todo está en macros, edita, bueno, exactamente en un copy-paste

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD:

¡no lo es, salió para el control de permisos en sí, no es necesario el método público!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

Y luego está esto, para el azúcar:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

Quería escribir lo que solía tener en lugar de

if( CheckPointer(m_order)==POINTER_INVALID )

fue así:

if(m_order==NULL)

pero recuerda cómo comprobar las sustituciones de macros en MQL

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


y si la memoria no me falla, a principios de año era posible desimprimir NULL en el registro y obtener 0 allí , ahora aparece un error

Es decir, el comportamiento NULL como si no debe cambiar en el futuro, pero lo que se sustituye allí en lugar de NULL no está claro, probablemente si esta situación se comprueba ahora, como se escribeif(CheckPointer(m_order)==POINTER_INVALID)) ) es por así decirlo el código correcto))