Inhalte aufrufen

  • Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden
Profilbild

Frage zu MT4 OOP Programmierung: Instanzenübergreifende Variable

- - - - -

  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
9 Antworten zu diesem Thema

  #1
OFFLINE   Pip Pip Hurra

Hallo,

 

ich arbeite mich gerade in die OOP Thematik von MQL 4.5 ein und bin dabei mir eine Klasse zum Visualisieren und Vermessen von Kursranges zu programmieren. Nun muss ich dazu sagen, dass ich eigentlich ein "prozeduraler" Entwickler bin, weshalb ich mich im OOP-Bereich erst einmal zurecht finden muss.

 

Mein Klasse "CRange" zeichnet unter anderem Rechtecke in den Chart. In der Klasse ist dazu ein Counter definiert, der die Anzahl der bereits gezeichneten Rechtecke repräsentiert. Der Counter ist auch Teil des Namens, den das Rechteck tragen wird:

 

Please Login or Register to see this Hidden Content

Dieser Counter wird bei jedem gezeichneten Objekt um eins erhöht.
 
In meinem EA, der diese Klasse nutzt, habe ich das Objekt wie folgt deklariert:
 

Please Login or Register to see this Hidden Content

Es gibt also die Objektvariable Range1, über die ich alle Funktionen und Daten der Klasseninstanz ansprechen kann.

Please Login or Register to see this Hidden Content

Das funktioniert soweit im Strategietester auch sehr gut. Dort laufen mehrere Tage durch und es wird gemäß Programmierung für jeden Tag die Range als Rechteck eingezeichnet. Schaue ich mir die Namen der im Chart gezeichneten Rechtecke an, dann sehe ich, dass der Name wie gewünscht den Wert des Counters enthält.

 

Please Login or Register to see this Hidden Content

Leider tritt ein Problem auf, wenn ich im selben EA eine zweite Instanz dieser Klasse erzeugen möchte, die ihrerseits ein Rechteck zeichnen möchte.

 

Ich deklariere die erste und zweite Klasseninstanz so:

Please Login or Register to see this Hidden Content

Nun ist es so, dass beide Klassen ihren eigenen Counter für die Rechtecke haben. Das Problem ist, wenn Objekt Range1 bereits ein Rechteck gezeichnet hat und Range2 danach sein erstes Rechteck zeichnen möchte, dass das dann nicht funktioniert.

 

Die Zeichenfunktion prüft nämlich, ob das Rechteck namentlich bereits im Chart existiert. 

Please Login or Register to see this Hidden Content

Und das ist bei Objekt Range2 bereits der Fall, denn in Range2 steht der Counter noch auf 0. Aber das Rechteck mit dem Namen RANGERECTNAME+0 exisitert bereits (erzeugt durch Objekt Range1), weshalb Range2 sein Rechteck nicht zeichnet.

 

Frage: Wie kann ich es erreichen, dass sich bei diesem Vorgang beliebig viele Instanzen der Klasse CRange nicht in die Quere kommen? In der Anleitung habe ich etwas von der Deklaration einer Variable als "static" gelesen, aber wenn ich...

Please Login or Register to see this Hidden Content

gegen

Please Login or Register to see this Hidden Content

tausche, dann funktionieren alle Aufrufe dieser Variable innerhalb der Klasse nicht mehr.

Kompiliere ich die Klasse, dann bekomme ich folgende Fehlrmeldung:

Please Login or Register to see this Hidden Content

Kann mir hier jemand einen hilfreichen Tipp geben, wie ich das Problem lösen kann?
Schon mal besten Dank.
 
Gruß PPH

Bearbeitet von Pip Pip Hurra, 29 May 2016 - 20:28 Uhr,


  #2
OFFLINE   traderdoc

So nebenbei: Du hast zwar zwei Objekte erzeugt, aber nach wie vor existiert nur eine Klasse.

Wird der Counter für beide Objekte unterschiedlich hochgezählt, dann lasse doch

vor dem nächsten Hochzählen erst einmal den Counter desjenigen Objekte auslesen,

incrementiere diese Variable und weise das Ergebnis der Eigenschaft des Objetes wieder zu.

 

traderdoc


Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #3
OFFLINE   Pip Pip Hurra

Danke für Deine schnelle Antwort.

 

Ich würde gern, dass die Klasse das selbst regelt und der Counter von außen gar nicht sichtbar ist. Für diesen Zweck soll angeblich die Variablendeklaration "static" gut sein, aber wie beschrieben kommt bei mir die Fehlermeldung, dass die statische Variable nicht aufgelöst werden kann. Warum das so ist, ist mir allerdings schleierhaft.

 

Die Anleitung sagt zu "static":

 

 

Static Members

The members of a class can be declared using the storage class modifier

Please Login or Register to see this Hidden Content

. These data members are shared by all instances of this class and are stored in one place. Non-static data members are created for each class object variable.

 

 

 

Eigentlich genau was ich brauche. Jede Instanz greift auf die selbe Speicherstelle zu, die den Wert der Variablen enthält. Also könnten alle Instanzen den Wert ändern und lesen (wenn ich denn die Klasse mal kompilieren könnte)

 

Wenn alle Stricke reißen, werde ich beim Objektaufruf bzw. der Definition der Range einfach einen String als weiteren Parameter übergeben, der alle Rechteck-Bezeichnungen dieser Instanz vorangestellt wird. Daher würden dann die Rechtecke in jeder Instanz anders heißen, auch wenn sie die gleiche Nummer als Suffix enthalten (z.B. "Morgens_Range0" und "Mittags_Range0").


Bearbeitet von Pip Pip Hurra, 29 May 2016 - 20:55 Uhr,


  #4
OFFLINE   Pip Pip Hurra

Okay, das war ne fiese Nummer:
 
Lt. folgendem Foreneintrag ist die Dokumentation zum MQL4/5 an dieser Stelle nicht korrekt: 

Please Login or Register to see this Hidden Content


Eine statische Variable muss zwingend auf globaler Ebene (innerhalb der Klasse) initialisiert werden.
 

Thank you for your message. MQL4 compiler has been changed, this block from 

Please Login or Register to see this Hidden Content

 will be removed entirely
It is not required to initialize static class members explicitly at the global level, they will be initialized automatically when you start the program. The static member of the 

Please Login or Register to see this Hidden Content

 and

Please Login or Register to see this Hidden Content

 type is automatically initialized with zero, to type 

Please Login or Register to see this Hidden Content

 

Please Login or Register to see this Hidden Content

 is assigned. For static members of the complex type 

Please Login or Register to see this Hidden Content

 is called; if there is none, then a constructor with default parameters is called.
Next sentense will be changed from

The static member of a class can be explicitly initialized with a desired value. To do this, it must be defined and initialized at the global level.

to

The static member of a class must be explicitly initialized with a desired value at the global level.

MQL4 reference will be updated soon.

 

Wobei "will be updatet soon." relativ ist, denn der obige Foreneintrag ist von März 2014 und meine Doku habe ich letztens erst runtergeladen - und da ist es noch falsch beschrieben. ;-)

 

Also, in meinem Fall muss das ganze jetzt wie folgt aussehen (falls das Problem irgendwann mal noch jemand haben sollte):

 

Please Login or Register to see this Hidden Content

Die letzte Zeile (die auf der globalen Ebene) ist die wichtige. Jetzt wird meine Klasse wieder fehlerfrei kompiliert.


Bearbeitet von Pip Pip Hurra, 29 May 2016 - 21:13 Uhr,


  #5
OFFLINE   Pip Pip Hurra

Nun doch noch eine andere Frage zu der Thematik:

 

Kann ich innerhalb des Konstruktors einer Klasse abfragen die wie vielte Instanz dieser Klasse gerade erzeugt wird? Also gibt es dafür eine Art globale, vordefinierte Variable?



  #6
OFFLINE   nightyhawk

Per Haus aus nicht - aber das kann doch auch mit einer global static nachbauen.... Anfangs auf Null setzen und im Konstruktur incrementieren sowie im Destruktor dekrementieren....


Chleudere den Purchen zu Poden!

  #7
OFFLINE   Pip Pip Hurra

stimmt. so habe ich es umgesetzt, es funktioniert jetzt alles wie gewünscht.

danke

Gesendet von meinem SM-G950E mit Tapatalk.

Bearbeitet von Pip Pip Hurra, 30 May 2016 - 08:34 Uhr,


  #8
OFFLINE   simplex

Nun muss ich dazu sagen, dass ich eigentlich ein "prozeduraler" Entwickler bin, weshalb ich mich im OOP-Bereich erst einmal zurecht finden muss.

 

Willkommen im Club! Das ist ziemlich genau auch mein Status bzgl. OOP. Als ich meine ersten Programme geschrieben habe (mit FORTRAN 77), wurde 'OOP' noch 'OOPS' genannt und bezeichnete den Zustand, nachdem Du den Karton mit Deinen Lochkartenstapel fallengelassen hattest.

 

Ich verfolge Deinen Thread erstmal. Vielleicht können wir uns beim Lernen gegenseitig unterstützen.


best wishes - simplex -

  #9
OFFLINE   Pip Pip Hurra

Hallo Simplex,

 

:) okay, ganz so "antik" sind meine Anfänge nicht (es ging auf einem Commodore VIC-20 los bzw. einem programmierbaren Sharp Taschenrechner), aber ich denke das spielt beim Einarbeiten und Verstehen  von OOP eher eine untergeordnete Rolle.

 

Da ich die Programmierung die meiste Zeit meines Lebens als Hobby betrieben habe, konnte ich mir natürlich die Sprachen aussuchen, die mir am ehesten behagen. Außerdem ist der Mensch ein Gewohnheitstier: "Ach komm, bisher habe ich auch alles prozedural lösen können, da muss ich nicht was neues lernen." ;-)

 

Aber so langsam erkenne ich die Vorteile von Daten- und Funktionskapselung in Objekten. OOP ist bei komplexen Programmen einfach extrem hilfreich finde ich.

 

Diesen thread hatte ich zwar nur aufgrund meiner aktuellen Frage geöffnet, aber prinzipiell habe ich nichts gegen Austausch und gegenseitiger Unterstützung einzuwenden.:)


  • suckertoo gefällt das

  #10
OFFLINE   Pip Pip Hurra

Noch eine Frage an die OOP-Fachleute.

 

Ich definiere in zwei unterschiedlichen Klassen im Abschnitt "private" je eine Struktur, die in beiden Fällen den gleichen Namen hat.

Please Login or Register to see this Hidden Content

Please Login or Register to see this Hidden Content

Binde ich nun beide Klassen in einem EA ein, dann bekomme ich beim Kompilieren die Fehlermeldung " 'struct_Settings' - struct or class already defined"

 

Ist das so geplant? Ich ging davon aus, dass der Scope der Struktur spätestens am Ende des jeweiligen Klassen-Blocks endet, wenn nicht sogar früher, da die Struktur im private-Block definiert wurde (ebenso wurde die strukturierte Variable, die diesen Strukturtyp verwendet im private Block deklariert).

 

Ich kann die Strukturen anders benennen, aber wie gesagt, ich bin mir nicht sicher, ob ich hier einfach was übersehen habe und die Strukturen doch richtigerweise in separaten Sichtbarkeitsbereichen auftauchen sollten. Dass sie sich also nicht gegenseitig "sehen" können.


Bearbeitet von Pip Pip Hurra, 31 May 2016 - 15:07 Uhr,




Similar Topics

  Thema Eröffnet von Statistik Letzter Beitrag




0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer