Diskussion zum Artikel "Verwendung von Objektzeigern in MQL5" - Seite 2

 

Guten Tag! Ich bin ein Anfänger. Ich habe eine Frage bezüglich der Verwendung des "*"-Symbols (Sternchen).

In der Beispieldatei:

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

"*" wird verwendet, um einen Zeiger auf ein Objekt zu deklarieren - das ist irgendwie klar.

Weiter:

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

Es ist nicht klar, wofür das "*"-Zeichen verwendet wird.

In der Hilfe heißt es: "Es ist möglich, Objekte eines komplexen Typs dynamisch zu erzeugen. Dies geschieht mit Hilfe des new-Operators" Der new-Operator wird hier nicht verwendet. Bitte erklären Sie genauer, wie und in welchen Fällen das "*"-Zeichen verwendet werden kann.

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

Aber weiter:

Es ist nicht klar, was das dort angebrachte "*"-Zeichen bedeutet.


Man kann es so schreiben

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

Es wird keinen Unterschied geben, es geht nur um den Stil der Gestaltung und einen kleinen ideologischen Ansatz.

 
Rosh:

Sie können es so schreiben

Es gibt keinen Unterschied, es geht nur um den Stil des Designs und einen kleinen ideologischen Ansatz.

D.h..

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

dies ist eine Deklaration eines Zeigers auf das Objekt (oder die Methode?) next()? Und dann, in geschweiften Klammern, wird das Objekt next selbst zurückgegeben? Verstehe ich das richtig?

Ich verstehe, dass alles sehr einfach sein sollte, aber da ich noch nie mit OOP in Berührung gekommen bin, tappe ich im Dunkeln. Bitte helfen Sie mir zu verstehen.

 
kogriv:

D.h..

ist eine Deklaration eines Zeigers auf das Objekt (oder die Methode?) next()?

Hier steht, dass die Funktion next() einen Zeiger auf eine Variable der Klasse CListItem zurückgibt.
 
kogriv:

Und dann, in geschweiften Klammern, wird das nächste Objekt selbst zurückgegeben, verstehe ich das richtig?

Der Körper der Funktion wird in geschweifte Klammern gesetzt,

{return(next);}

bedeutet das, dass die Funktion die Variable next zurückgibt, die den Typ eines Zeigers auf ein Objekt der Klasse CListItem hat. Dies stimmt im Allgemeinen mit dem Typ der Funktion überein.

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

Gleich nach dem ersten Beispiel enthält der Artikel den Satz "Die Variable pstatus ist ein Zeiger auf ein Objekt, aber wir haben absichtlich "vergessen", das Objekt selbst mit dem new-Operator zu erstellen und es als Parameter an die Funktion PrintStatus() zu übergeben ".

1. Es ist unklar, was Sie "genau" übergeben haben - einen Zeiger oder ein Objekt?

2. In dem Beispiel gibt es keine PrintStatus()-Funktion.

[Gelöscht]  

Ich glaube, es liegt ein Fehler vor:

//+------------------------------------------------------------------+
//| Hinzufügen eines Eintrags zur Liste|
//+------------------------------------------------------------------+
CList::addItem(CListItem *item)
  {
//--- zuerst die Korrektheit des übergebenen Zeigers prüfen
   if(CheckPointer(item)==POINTER_INVALID) return;
//--- Erhöhung der Anzahl der Einträge in der Liste
   m_counter++;
//--- wenn noch keine Einträge in der Liste vorhanden sind
   if(CheckPointer(first)!=POINTER_DYNAMIC)
     {
      first=item;
     }
   else
     {
      //--- Element auf den Zeiger des vorherigen Objekts setzen----------------------- Beginn des Fehlers-----------------------
      item.prev(first);
      //--- Merken des Zeigers des aktuellen ersten Elements
      CListItem *p=first;
      //--- das eingehende Element an die Stelle des ersten Elements setzen
      first=item;
      //--- den Zeiger des nächsten Objekts für das erste Element der Liste setzen
      first.next(p);
     }
  } 
Es scheint, dass das neue Listenelement prev und first hat, die auf das zweite Element verweisen, und das zweite Element erhält keinen Verweis auf das erste Element.
 
Yedelkin:

Gleich nach dem ersten Beispiel enthält der Artikel den Satz "Die Variable pstatus ist ein Objektzeiger, aber wir haben absichtlich "vergessen", das Objekt selbst mit dem new-Operator zu erstellen und es als Parameter an die Funktion PrintStatus() übergeben ".

1. Es ist unklar, was genau übergeben wurde - ein Zeiger oder ein Objekt?

2. Es gibt keine PrintStatus()-Funktion in dem Beispiel.

Besser spät als nie. Danke, im Artikel korrigiert. Das Ende des Satzes wurde entfernt

Direkt nach dem ersten Beispiel enthält der Artikel den Satz "Die Variable pstatus ist ein Zeiger auf ein Objekt, aber wir haben absichtlich "vergessen", das Objekt selbst mit dem new-Operator zu erzeugen und es als Parameter an die Funktion PrintStatus() zu übergeben ".

 
220Volt:

Ich glaube, es liegt ein Fehler vor:

Es scheint, dass das neue Listenelement prev und first hat, die auf das zweite Element verweisen, und das zweite Element erhält keinen Verweis auf das erste Element.

Ja, das ist ein Tippfehler. Anstelle von

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

sollte

else
     {
      //--- für die erste eingestellt указатель предыдущего объекта
      first.prev(item);
korrigiert werden.
[Gelöscht]  

Ich verstehe immer noch nicht, über Zeiger und Referenzen in MQL5 und jetzt in MQL4. Was ist der Unterschied zwischen der Übergabe von Referenzen und Zeigern, außer dem zusätzlichen Code? In C++ gibt es einen Unterschied, aber was ist er hier? Wenn es nicht schwierig ist, schreiben Sie bitte ausführlichere Informationen.