Preguntas sobre POO en MQL5 - página 14

 
TheXpert:

también está bajo la custodia de los moderadores

Quien haya dicho algo sobre la custodia... pero un personaje con dos excentricidades...

 
TheXpert:

también bajo la tutela de los moderadores

Pensé que había borrado mi propio post.
 
Vladimir Simakov:
Parece que he borrado mi propio post.

Este era el caso cuando un objeto se crea en una función a través de new. Originalmente, hablamos de pasar un puntero a un objeto existente. Y aquí, se puede pasar así:

void f(CObj * obj){}

 
Dmitry Fedoseev:

Y si hay que pasar un puntero a una función para crear un objeto en la función, así es como funciona:

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
Eso es todo lo que querías saber sobre OOP, pero tenías miedo de preguntar))

Este código me saca el terminal. En el mejor de los casos, provoca un error crítico en la depuración (para ver la animación haga clic en la imagen):


Es extraño que el compilador se salte esta construcción.

 
Chicos, dejad de pelearos entre vosotros, sobre todo en igualdad de condiciones.
Dmitry dio el primer ejemplo con un error, ¿y qué hay de malo en ello?
Dim, sí compila sin errores, pero al ejecutar el script aparece un error.

Vladimir lo ha corregido y ha añadido un puntero, el código ha funcionado correctamente.
¿Qué más necesitamos? Ahora tenemos que averiguar quién es el más guay? ))))
Chicos, sed respetuosos los unos con los otros, y no recurráis a personalismos e insultos con prepotencia.

Ejemplo inicial de Dimitri
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Corrección de Vladimir.
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Mi corrección con una impresión del resultado del método, para verificar
Este ejemplo ya funciona, ¿qué más necesitas?
Deja de intentar averiguar quién es más guay o no, todo el mundo tiene errores y erratas.
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
En el transcurso de estos argumentos, creo que hemos identificado un error del compilador.
¿Por qué el compilador no compila el ejemplo inicial de Dimitri sin errores?
 
Vasiliy Sokolov:

Este código me saca el terminal. En el mejor de los casos, provoca un error de depuración crítico:

Es extraño que tal construcción sea pasada por el compilador.

Aquí todo es válido para el compilador.

Se crea un puntero a un objeto en el segmento de datos del programa y se inicia 0x0 durante la compilación.

Los comandos necesarios para el procesador se crean en el segmento de código.

En tiempo de ejecución, los comandos se levantan en la pila en la dirección de la función z(...).

Y allí mover rdx [0x0]

Y el acceso a una dirección de memoria nula está prohibido. La desreferenciación de un puntero nulo se denomina

 
Vladimir Simakov:
Aquí todo es válido para el compilador.

¿Para qué compilador?

 
Vasiliy Sokolov:

Este código me saca el terminal. En el mejor de los casos, provoca un error crítico en la depuración (para ver la animación haga clic en la imagen):


Es extraño que el compilador se salte esta construcción.

El mío compila, funciona correctamente, pero muestra un mensaje de pérdida de memoria (borrar no funciona) al finalizar.

 
Igor Makanu:

Ya le enseñarás lo malo, es lo bueno lo que hay que tratar )))

#define private protected

No te has sentado con los códigos de fxsaber por nada. A mí me parece una obra maestra.

 

Disculpas por la información errónea, antes escribí que no se puede llamar al método Create() en una clase hija.

Ahora, comprobado de nuevo, se puede. Pero el acceso al miembro privado m_button no estaba disponible. Es decir, era imposible comprobar, por ejemplo, el estado del botón: pulsado/liberado.

Ahora con la pista de Igor es posible.

#define private protected
#include <Controls\Button.mqh>

class CMyButton : public CButton
{ 
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
}; 

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}
Razón de la queja: