Fragen zu OOP in MQL5 - Seite 14

 
TheXpert:

liegt ebenfalls in der Obhut der Moderatoren

Wer auch immer etwas von Sorgerecht gesagt hat... sondern eine Figur mit zwei Exzentrizitäten...

 
TheXpert:

auch unter der Vormundschaft der Moderatoren

Ich dachte, ich hätte meinen eigenen Beitrag gelöscht.
 
Vladimir Simakov:
Ich scheine meinen eigenen Beitrag gelöscht zu haben.

Dies war der Fall, wenn ein Objekt in einer Funktion über new erstellt wird. Ursprünglich ging es darum, einen Zeiger auf ein vorhandenes Objekt zu übergeben. Und hier kann es so weitergegeben werden:

void f(CObj * obj){}

 
Dmitry Fedoseev:

Und wenn ein Zeiger an eine Funktion übergeben werden muss, um ein Objekt in der Funktion zu erstellen, dann funktioniert das auch so:

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

CObj * obj;

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

void z(CObj & o){
   o = new CObj();
}
Das ist alles, was Sie über OOP wissen wollten, aber nicht zu fragen wagten)))

Dieser Code schmeißt das Terminal für mich raus. Im besten Fall verursacht es einen kritischen Fehler bei der Fehlersuche (für eine Animation klicken Sie auf das Bild):


Seltsam, dass ein solches Konstrukt vom Compiler übersprungen wird.

 
Leute, hört auf, euch zu streiten, vor allem, wenn es um gleiche Bedingungen geht.
Dmitry hat das erste Beispiel mit einem Fehler angegeben, und was ist daran falsch?
Dim, ja, es kompiliert ohne Fehler, aber wenn Sie das Skript ausführen, erscheint ein Fehler.

Vladimir korrigierte es und fügte einen Zeiger hinzu, der Code funktionierte korrekt.
Was brauchen wir sonst noch? Jetzt müssen wir herausfinden, wer der Coolste ist. ))))
Leute, seid respektvoll zueinander und greift nicht auf Persönlichkeiten und Beleidigungen mit Arroganz zurück.

Erstes Beispiel von Dimitri
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


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

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Berichtigung durch Vladimir.
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Meine Korrektur mit einem Ausdruck des Methodenergebnisses, um zu überprüfen
Dieses Beispiel funktioniert jetzt, was brauchen Sie noch?
Hören Sie auf zu versuchen, herauszufinden, wer cooler ist oder nicht, jeder hat Tippfehler und Fehler.
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);
}
Im Zuge dieser Argumente haben wir wohl einen Compilerfehler festgestellt.
Warum überspringt der Compiler die Kompilierung des ersten Beispiels von Dmitri ohne Fehler?
 
Vasiliy Sokolov:

Dieser Code schmeißt das Terminal für mich raus. Bestenfalls verursacht es einen kritischen Fehler bei der Fehlersuche:

Es ist seltsam, dass ein solches Konstrukt vom Compiler durchgelassen wird.

Hier gilt alles für den Compiler.

Ein Zeiger auf ein Objekt im Programmdatensegment wird erstellt und während der Kompilierung 0x0 initiiert.

Die notwendigen Befehle an den Prozessor werden im Codesegment erstellt.

Zur Laufzeit werden die Befehle auf dem Stack an der Adresse der Funktion z(...) abgelegt.

Und dort bewegen rdx [0x0]

Und der Zugriff auf eine Null-Speicheradresse ist verboten. Die Dereferenzierung eines Null-Zeigers wird als

 
Vladimir Simakov:
Hier gilt alles für den Compiler.

Für welchen Compiler?

 
Vasiliy Sokolov:

Dieser Code schmeißt das Terminal für mich raus. Im besten Fall verursacht es einen kritischen Fehler bei der Fehlersuche (für eine Animation klicken Sie auf das Bild):


Seltsam, dass ein solches Konstrukt vom Compiler übersprungen wird.

Meine kompiliert, funktioniert richtig, aber zeigt ein Speicherleck (Löschen funktioniert nicht) Nachricht nach Abschluss.

 
Igor Makanu:

Du bringst ihm jetzt die schlechten Dinge bei, die guten müssen erst noch behandelt werden )))

#define private protected

Sie haben sich nicht umsonst mit den fxsaber-Codes beschäftigt. Das klingt für mich wie ein Meisterwerk.

 

Entschuldigung für die Fehlinformation, ich habe vorhin geschrieben, dass man die Methode Create() nicht in einer untergeordneten Klasse aufrufen kann.

Jetzt doppelt geprüft, Sie können. Der Zugang zum privaten Mitglied m_button war jedoch nicht verfügbar. D.h. es war nicht möglich, z.B. den Zustand der Taste zu überprüfen : gedrückt/freigegeben.

Mit Igors Hinweis ist das jetzt möglich.

#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
}