Discussione sull’articolo "Usare i Puntatori di Oggetti in MQL5" - pagina 2

 

Buon pomeriggio. Sono un principiante. Ho una domanda sull'uso dell'icona "*" (asterisco).

Nel file samplelist:

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

"*" è usato per dichiarare un puntatore a un oggetto - questo è abbastanza chiaro.

Poi:

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

Non è chiaro a cosa serva il segno "*".

Secondo la guida,"è possibile creare dinamicamente oggetti di tipo complesso. L' operatore new non viene utilizzato in questo caso. Si prega di spiegare più dettagliatamente come e in quali casi è possibile utilizzare il segno "*".

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

Inoltre, però:

Non è chiaro il significato del segno "*" posto lì.


Si può scrivere così

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

Non ci sarà alcuna differenza, riguarda solo lo stile del design e un piccolo approccio ideologico.

 
Rosh:

Si può scrivere in questo modo

Non ci sarà alcuna differenza, riguarda solo lo stile del design e un piccolo approccio ideologico.

Cioè.

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

questa è una dichiarazione di un puntatore all'oggetto (o metodo?) next()? E poi, tra parentesi graffe, viene restituito l'oggetto next stesso? Ho capito bene?

Capisco che tutto dovrebbe essere molto semplice, ma dato che non ho mai incontrato l'OOP prima, sto vagando in 3 pini. Per favore, fatemi capire.

 
kogriv:

Cioè.

è una dichiarazione di un puntatore all'oggetto (o metodo?) next()?

Dice che la funzione next() restituisce un puntatore a una variabile della classe CListItem.
 
kogriv:

E poi, tra parentesi graffe, viene restituito l'oggetto successivo? Ho capito bene?

Il corpo della funzione è racchiuso tra parentesi graffe,

{return(next);}

significa che la funzione restituirà la variabile next, che ha il tipo di un puntatore a un oggetto della classe CListItem. In generale, questo corrisponde al tipo della funzione.

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

Subito dopo il primo esempio, l'articolo contiene la frase "La variabile pstatus è un puntatore a un oggetto, ma abbiamo deliberatamente "dimenticato" di creare l'oggetto stesso usando l'operatore new e lo abbiamo passato come parametro alla funzione PrintStatus()".

1. Non è chiaro cosa sia stato passato "esattamente": un puntatore o un oggetto?

2. Nell'esempio non c'è nessuna funzione PrintStatus().

 

Credo che ci sia un errore:

//+------------------------------------------------------------------+
//| aggiungere un elemento all'elenco|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- prima verifica la correttezza del puntatore passato
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- aumentare il numero di elementi nell'elenco
   m_counter++;
//--- se non ci sono ancora elementi nell'elenco
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- imposta l'oggetto al puntatore dell'oggetto precedente----------------------- Inizio dell'errore-----------------------
      item.prev(first);
      //--- ricordare il puntatore del primo elemento corrente
      CListItem *p=first;
      //--- mettere l'elemento in arrivo al posto del primo elemento
      first=item;
      //--- impostare il puntatore dell'oggetto successivo per il primo elemento della lista
      first.next(p);
     }
  } 
Sembra che il nuovo elemento della lista abbia prev e first che fanno riferimento al secondo elemento, e il secondo elemento non ottiene un riferimento al primo elemento.
 
Yedelkin:

Subito dopo il primo esempio, l'articolo contiene la frase "La variabile pstatus è un puntatore a un oggetto, ma abbiamo deliberatamente "dimenticato" di creare l'oggetto stesso con l'operatore new e lo abbiamo passato come parametro alla funzione PrintStatus()".

1. Non è chiaro cosa sia stato passato esattamente: un puntatore o un oggetto?

2. Nell'esempio non c'è la funzione PrintStatus().

Meglio tardi che mai. Grazie, corretto nell'articolo. La fine della frase è stata rimossa

Subito dopo il primo esempio, l'articolo contiene la frase "La variabile pstatus è un puntatore a un oggetto, ma abbiamo deliberatamente "dimenticato" di creare l'oggetto stesso con l'operatore new e lo abbiamo passato come parametro alla funzione PrintStatus()".

 
220Volt:

Credo che ci sia un errore:

Sembra che il nuovo elemento della lista abbia prev e first che fanno riferimento al secondo elemento, e il secondo elemento non ottiene un riferimento al primo elemento.

Sì, c'è un errore di battitura. Invece di

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

dovrebbe essere

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

Non riesco ancora a capire i puntatori e i riferimenti in MQL5 e ora in MQL4. Qual è la differenza tra passaggio per riferimento e puntatore, a parte il codice extra? C'è una differenza in C++, ma qual è qui? Se non è difficile, si prega di scrivere informazioni più dettagliate.