Fragen zu OOP in MQL5 - Seite 12

 
Vasiliy Pushkaryov:

Ein Ratschlag zu einem anderen Thema. Wenn Sie eine Unterklasse CMyButton von CButton erstellen, können Sie eine Schaltfläche erstellen und dann ihre Eigenschaften außerhalb der Klasse ändern. Im Folgenden wird dies in OnInit() durchgeführt.

Aber wenn ich zusätzliche Felder innerhalb der Kindklasse erstellen und die eingebauten Eigenschaften der CButton-Klasse in neuen Funktionen verwenden möchte, wie kann ich dies korrekt tun?

In der Klasse CButton wird das Klassenmitglied m_button im Abschnitt private deklariert.

Ich kann nicht in den privaten Bereich der übergeordneten Klasse gelangen.

Vielleicht könnten wir es einfach und geradlinig halten - schauen Sie sich an, wie der Name des grafischen Objekts in der CButton-Klasse gebildet wird und arbeiten Sie direkt mit diesen grafischen Objekten. Umso mehr bei einer Schaltfläche, die nur ein grafisches Objekt hat, sollte es einfach sein.

 
TheXpert:

Ja, bereits zwei unbeteiligte Personen haben ein Kreuz aus Ihrem Code gemacht.)

Ihr Code kann nicht richtig funktionieren - das ist aus dem Code selbst ersichtlich).

Zwei Personen? Das entspringt Ihrer Fantasie, was? Sie sollten zumindest genauer lesen oder sich die Bilder genauer ansehen. Die erste Meldung stammt von einem Debugger. Es wird kompiliert und funktioniert ohne den Debugger.

 
Dmitry Fedoseev:

Zwei Personen? Aus deiner Fantasie, hm? Sie sollten genauer lesen oder sich zumindest die Bilder genauer ansehen. Die erste Meldung kommt von einem Debugger. Ohne Debugger kompiliert es und funktioniert.

Ich habe es ohne Debugger zum Absturz gebracht.)

es stürzt auch im Debugger ab ))

vielleicht wissen Sie einfach nicht, wo Sie das Ausgabeprotokoll des Skripts einsehen können? )))

 
TheXpert:

Ich stürze ohne Debugger ab)

Ich bin auch im Debugger am Klettern).

vielleicht wissen Sie einfach nicht, wo Sie das Ausgabeprotokoll des Skripts einsehen können? )))

Nein, ich weiß es nicht, sag mir, wo es ist.

 
Vasiliy Pushkaryov:

Ein Ratschlag zu einem anderen Thema. Wenn Sie eine Unterklasse CMyButton von CButton erstellen, können Sie eine Schaltfläche erstellen und dann ihre Eigenschaften außerhalb der Klasse ändern. Im Folgenden wird dies in OnInit() durchgeführt.

Aber wenn ich zusätzliche Felder innerhalb der Kindklasse machen möchte, und verwenden Sie die eingebauten Eigenschaften der Klasse CButton in neue Funktionen, wie kann dies korrekt implementiert werden?

In der Klasse CButton ist das Klassenmitglied m_button im Abschnitt private deklariert.

Ich denke, Sie lösen Ihr Problem wieder von der "Schwanz"-Seite, ich würde vorschlagen, es von der anderen Seite zu lösen:

class CMyButton : public CButton
{ 
  private: 
   CButton        *mybtn;
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
        void    setProp();          // задаем в ходе программы свойства
}; 

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


Dmitry Fedoseev:

Sie können nicht in den privaten Bereich der übergeordneten Klasse gelangen.

Sie können zumindest mit #define einsteigen und mit dynamic_cast experimentieren. Letztes Jahr habe ich dynamic_cast studiert und es leistet Erstaunliches, aber es ist ein zeitraubender Prozess


TheXpert:

ich habe es ohne Debugger geschafft )

geprüft - ich bekam auch: 2019.07.05 17:10:27.307 1 (EURUSD,H1) ungültiger Zeigerzugriff in '1.mq5' (43,6)

 

Und Sie haben mich fasziniert, also dachte ich, vielleicht bin ich wirklich der Idiot, für den Sie mich halten. Ich habe einen Code ausgegraben, den ich vor fünf Jahren geschrieben habe, hier ist ein Ausschnitt:

Also, Sie können... spucken Sie Ihre... alles was du willst... ...und träumen, dass ich ein Idiot bin, aber bis jetzt ist es umgekehrt. Ihr hüpft herum wie die Verrückten und es nützt nichts.

***

Und bei meinem Code wird trotz der Tatsache, dass er kompiliert und funktioniert, schnell klar, dass etwas nicht stimmt. Das Objekt wird nicht über delete gelöscht.

Aber Sie glauben gerne, dass ich gar nicht weiß, was: CObj obj; glauben Sie nur weiter...

***

Aber sie sind bereit, sich die Ohren abzuschneiden, "um ihren Großvater zu ärgern". Sogar ihr Müllsammler erschien in MQL.

 
Dmitry Fedoseev:

Und Sie haben mich fasziniert, also dachte ich, vielleicht bin ich wirklich der Idiot, für den Sie mich halten. Ich habe einen Code ausgegraben, den ich vor fünf Jahren geschrieben habe, hier ist ein Ausschnitt:

Also, Sie können... spucken Sie Ihre... alles was du willst... ...und sagen, ich sei ein Idiot, aber bisher ist es umgekehrt.

Hier ist alles korrekt, der Verweis ist auf einen Zeiger, und der, der die ganze Aufregung verursacht, ist ein Verweis auf ein Objekt, das nicht existiert. Sehen Sie sich den Code genau an.
 
Vladimir Simakov:
Hier ist alles korrekt, der Zeiger wird referenziert, während derjenige, um den sich der ganze Streit dreht, ein Verweis auf ein Objekt ist, das nicht existiert. Sehen Sie sich den Code genau an.

Glauben Sie wirklich, dass ich nicht bemerken kann, dass an einer Stelle ein * und an einer anderen ein * & steht?

Und glauben Sie auch, dass ich nicht weiß, wasCObj obj; ist?

 
Vladimir Simakov:
...ein Verweis auf ein Objekt, das nicht existiert...

Aber es kompiliert und funktioniert.

 
Dmitry Fedoseev:

Glauben Sie wirklich, dass ich nicht bemerken kann, dass an einer Stelle ein * und an einer anderen ein * & steht?

Und glauben Sie auch, dass ich nicht weiß, wasCObj obj; ist?

Sie haben es getan.
void z(CObj & o){
   o = new CObj();
}