Discusión sobre el artículo "Usando los punteros de objeto en MQL5" - página 2

 

Buenas tardes. Soy principiante. Tengo una duda sobre el uso del icono "*" (asterisco).

En el archivo samplelist

class CListItem
  {
private:
   int               ID;
   CListItem        *next;
   CListItem        *prev;

"*" se utiliza para declarar un puntero a un objeto - esto está bastante claro.

A continuación:

public:
                    ~CListItem();
   ...
   CListItem*        next(){return(next);}
   CListItem*        prev(){return(prev);}

No está claro para qué se utiliza el signo "*".

Según la ayuda,"es posible crear dinámicamente objetos de tipo complejo. El operador new no se utiliza aquí. Por favor, explique con más detalle cómo y en qué casos se puede utilizar el signo "*".

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
kogriv:

Además, sin embargo:

No está claro qué significa el signo "*" colocado ahí.


Se puede escribir así

public:
                    ~CListItem();
   ...
   CListItem        *next(){return(next);}
   CListItem        *prev(){return(prev);}

No habrá ninguna diferencia, sólo afecta al estilo del diseño y a un pequeño enfoque ideológico.

 
Rosh:

Puede escribirlo así

No habrá ninguna diferencia, sólo se trata del estilo de diseño y de un pequeño enfoque ideológico.

Es decir

CListItem        *next(){return(next);}

esto es una declaración de un puntero al objeto (¿o método?) next()? Y luego, entre llaves, se devuelve el propio objeto next? ¿Lo he entendido bien?

Entiendo que todo debería ser muy sencillo, pero como no me he topado con la programación orientada a objetos antes, estoy vagando en 3 pinos. Por favor, hazme entender.

 
kogriv:

Es decir.

¿es una declaración de un puntero al objeto (¿o método?) next()?

Dice que la función next() devuelve un puntero a una variable de la clase CListItem.
 
kogriv:

Y luego, entre llaves, se devuelve el objeto siguiente? ¿Lo he entendido bien?

El cuerpo de la función se da entre llaves,

{return(next);}

significa que la función devolverá la variable next, que tiene el tipo de un puntero a un objeto de la clase CListItem. En general, esto coincide con el tipo de la función.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Justo después del primer ejemplo, el artículo contiene la frase "La variable pstatus es un puntero de un objeto, pero "olvidamos" deliberadamente crear el propio objeto utilizando el operador new y lo pasamos como parámetro a la función PrintStatus()".

1. No está claro qué pasaste "exactamente": ¿un puntero o un objeto?

2. No hay ninguna función PrintStatus() en el ejemplo.

[Eliminado]  

Creo que hay un error:

//+------------------------------------------------------------------+
//| añadir un elemento a la lista|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- primero comprueba si el puntero pasado es correcto
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- aumenta el número de elementos de la lista
   m_counter++;
//--- si aún no hay elementos en la lista
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- fijar item al puntero del objeto anterior----------------------- Inicio del error-----------------------
      item.prev(first);
      //--- recuerda el puntero del primer elemento actual
      CListItem *p=first;
      //--- poner el elemento entrante en lugar del primer elemento
      first=item;
      //--- establece el puntero del siguiente objeto para el primer elemento de la lista
      first.next(p);
     }
  } 
Parece que el nuevo elemento de la lista tiene prev y first referenciando al segundo elemento, y el segundo elemento no obtiene una referencia al primer elemento.
 
Yedelkin:

Justo después del primer ejemplo, el artículo contiene la frase "La variable pstatus es un puntero a un objeto, pero "olvidamos" deliberadamente crear el propio objeto con el operador new y lo pasamos como parámetro a la función PrintStatus()".

1. No está claro qué se pasó exactamente: ¿un puntero o un objeto?

2. No hay función PrintStatus() en el ejemplo.

Más vale tarde que nunca. Gracias, arreglado en el artículo. Se ha eliminado el final de la frase

Justo después del primer ejemplo, el artículo contiene la frase "La variable pstatus es un puntero de un objeto, pero "olvidamos" deliberadamente crear el propio objeto utilizando el operador new y lo pasamos como parámetro a la función PrintStatus()".

 
220Volt:

Creo que hay un error:

Parece que el nuevo elemento de la lista tiene prev y first referenciando al segundo elemento, y el segundo elemento no obtiene una referencia al primer elemento.

Sí, hay un error tipográfico. En lugar de

 else
     {
      //--- set item  указатель предыдущего объекта                                         
      item.prev(first);

debería

else
     {
      //--- set for first указатель предыдущего объекта
      first.prev(item);
corregido.
[Eliminado]  

Todavía no entiendo acerca de los punteros y referencias en MQL5 y ahora en MQL4. ¿Cuál es la diferencia entre pasar por referencia y puntero a excepción de código extra? Hay una diferencia en C ++, pero ¿qué es aquí? Si no es difícil, por favor escriba información más detallada.