Preguntas de POO (Programación Orientada a Objetos) - página 8

 
C-4:
Typeid() desafortunadamente no existe, y la fuerza de las plantillas está en la identificación estática. Las distintas tareas se resuelven con métodos diferentes y decir que un método es malo y el otro bueno es una suposición agravante.

Tuve un caso en el que se necesitaba una identificación dinámica. Todas las soluciones eran muy engorrosas, excepto la de tipo universal. Realizado a través de una clase que implementa un tipo universal.

Pero también me metí en problemas. Algo ha cambiado en STL (string) desde VS 2012 y desde entonces no compila. Todavía no lo he resuelto.

 
Pavlick:

Huh, no son punteros, sino risas en un palo.


La página en el segundo enlace de mi post dice:

En MQL4 se pueden crear dinámicamente objetos de tipo complejo. Para ello se utiliza el operador new, que devuelve el descriptor del objeto creado.

El descriptor tiene un tamaño de 8 bytes. Sintácticamente, los descriptores de objetos en MQL4 son similares a los punteros en C++.

Ejemplos:

MyObject* hobject= new MyObject();

De nuevo, a diferencia de C++, la variable hobject del ejemplo anteriorno es un puntero a memoria, sino un descriptor de objeto.


 
EverAlex:

La página en el segundo enlace de mi post dice:

En MQL4 se pueden crear dinámicamente objetos de tipo complejo. Esto se hace mediante el operador new, que devuelve un descriptor del objeto creado.

El descriptor tiene un tamaño de 8 bytes. Sintácticamente, los descriptores de objetos en MQL4 son similares a los punteros en C++.

Ejemplos:

MyObject* hobject= new MyObject();

De nuevo, a diferencia de C++, la variable hobject del ejemplo anteriorno es un puntero a memoria, sino un descriptor de objeto.

El compañero mql5 ha aclarado la situación aquí https://www.mql5.com/ru/forum/150943/page6#950107 . Sin saberlo, estaba exagerando.
 

No antes de ayer pregunté al soporte técnico sobre la separación del archivo de implementación de la clase del archivo de la interfaz. Y obtuve una respuesta:

В MQL нет файла проекта, фактически им выступает mq4 файл, а программа обязана иметь точки входа (при их отсутствии выдаётся ошибка "event handling function not found"). Поэтому при разделении интерфейса от реализации класса, файлом-реализации и интерфейса должны быть mqh файлы.

La conclusión es que, en esencia, no es una opción lógica. Después de todo, el archivo con la implementación de la clase es un archivo de implementación, para protegerlo de los clientes. Y si ambos están en formato abierto, es decir, en formato .mqh, ¿para qué necesitamos hacer esto?

 
hoz:

No antes de ayer pregunté al soporte técnico sobre la separación del archivo de implementación de la clase del archivo de la interfaz. Y obtuve una respuesta:

La conclusión es que no es una opción lógica. Después de todo, el archivo con la implementación de la clase es un archivo de implementación, para protegerlo de los clientes. Y si ambos están en formato abierto, es decir, en formato .mqh, ¿por qué hacerlo?

Nunca separo la declaración de la aplicación. Escribo todo en un archivo de cabecera. Esto es mucho más conveniente. Hay que seguir un archivo, no dos. Me alegro si sólo hay tres métodos en una clase. Pero, ¿y si son 100? Te cansarás de comparar los dos archivos. Escribirás en uno y te olvidarás en el otro...

Sólo hay un caso en el que es necesario dividir los archivos. Es cuando dos o más clases se refieren entre sí. Estas soluciones deben evitarse. Esto es cierto para C++. No sé cómo hacerlo en MQL.

 

En el libro de texto, y en particular aquí están los códigos:

//+------------------------------------------------------------------+
//| Класс, реализующий элемент списка                                |
//+------------------------------------------------------------------+
class CItem
  {
   int               m_id;
   string            m_comment;
   CItem*            m_next;
public:
                     CItem() { m_id=0; m_comment=NULL; m_next=NULL; }
                    ~CItem() { Print("Destructor of ",m_id,
                                     (CheckPointer(GetPointer(this))==POINTER_DYNAMIC)?
                                     "dynamic":"non-dynamic"); }
   void              Initialize(int id,string comm) { m_id=id; m_comment=comm; }
   void              PrintMe() { Print(__FUNCTION__,":",m_id,m_comment); }
   int               Identifier() { return(m_id); }
   CItem*            Next() {return(m_next); }
   void              Next(CItem *item) { m_next=item; }
  };
//+------------------------------------------------------------------+
//| Простейший класс списка                                          |
//+------------------------------------------------------------------+
class CMyList
  {
   CItem*            m_items;
public:
                     CMyList() { m_items=NULL; }
                    ~CMyList() { Destroy(); }
    bool             InsertToBegin(CItem* item);
    void             Destroy();
  };

Están disponibles los siguientes campos:

void              Next(CItem *item) { m_next=item; }

 bool             InsertToBegin(CItem* item);
¿Por qué en un caso el * está a la derecha y en el otro a la izquierda?
 
hoz:

En el libro de texto, y en particular aquí están los códigos:

Hay campos así:

¿Por qué el signo * está en un caso a la derecha y en el otro a la izquierda?

Eso dice. No importa.

Yo mismo escribo el operador "*" para denotar un puntero junto a un tipo a su derecha (int*) y al desreferenciar una variable a su izquierda (*pnVal).

 
Zhunko:

Eso es lo que dice. No importa.

Yo mismo escribo el operador "*" para denotar un puntero junto a un tipo a su derecha (int*) y, al desreferenciarlo, junto a una variable a su izquierda (*pnVal).

Me lo imaginaba. Tal vez un programador poco atento escribió la muestra.

Hay algunas otras cosas extrañas allí:

 CItem*            m_next;

¿Significa que la clase CItem tiene asignado un descriptor de objeto m_next?

 
hoz:

En el libro de texto, y en particular aquí están los códigos:

Están disponibles los siguientes campos:

¿Por qué en un caso el * está a la derecha y en el otro a la izquierda?

No está a la izquierda ni a la derecha, está en medio.
 
hoz:

Eso es lo que pensé. Supongo que un programador poco atento escribió el ejemplo.

Hay algunas otras cosas extrañas allí:

¿Significa que la clase CItem está asignada con el descriptor de objeto m_next?


Esto significa que hay que crear una instancia con el operador new.