[MQL4/OOP] Klasse in een klasse initialiseren lukt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
Ik ben na lange tijd weer wat aan het programmeren (in mql4, wat lijkt op C++) en kom niet helemaal uit de volgende case. Ik zal hem iets versimpeld weergeven.

Stel ik heb een fiets en van die fiets wil ik een klasse maken. Dit doe ik met de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Fiets
{
   private:
      int      variableA;
      bool     variableB; 
   public:
      void Fiets(int A, bool B)
      {
         variableA = A;
         variableB = B;
         
      };
      
      void     DoeIets();
};

Die fiets kan iets doen dmv de methode DoeIets.

Nu zitten er wielen aan een fiets en die Dat wiel definieer ik met de wiel klasse:

code:
1
2
3
4
5
6
7
8
9
10
11
12
class Wiel
{
   private:
      int VariableC;
   public:
      void Wiel(int C)
      {
         VariableC = C;
      };
      
      double Draai();
};

Elk wiel heeft dus een methode Draai.

De methoden heb ik uiteraard ook in de code staan:
code:
1
2
3
4
5
6
7
8
9
void Fiets::DoeIets()
{  
    //Doe iets
}

double Wiel::Draai()
{
    return(2.0);
}


Nu wil ik dus dat elke fiets standaard 2 wielen meekrijgt op het moment dat er in mijn programma een Fiets aangemaakt wordt. Ik dacht dit te doen in de klasse Fiets dit op te nemen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fiets
{
   private:
      int variableA;
      bool variableB;
      Wiel wiel1;
      Wiel wiel2;
   public:
      void Fiets(int A, bool B)
      {
         variableA = A;
         variableB = B;
         wiel1 = wiel1(1);
         wiel2 = wiel2(2);
      };
      
      void DoeIets();
};


Zodat ik binnen de methodes van de klasse Fiets altijd een Wiel en zijn functie kan aanroepen met bijvoorbeeld wiel1.Draai(); Het probleem echter is dat ik in de constructor van Fiets geen variabelen aan mag maken van het type Wiel, alleen de standaard int, bool, double, enz. Ik krijg dan de error 'declaration without type'.

Welke fout maak ik hier? Ik wil Wiel wel als klasse hebben omdat ik de optie wil hebben om binnen Fiets nog meer objecten van Wiel aan te maken.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 06:21
Normaalgesproken zou ik zeggen dat het moet zijn

code:
1
wiel1 = new Wiel(1);


Let op het keyword "new".
Dit is echter in de meeste talen zo, weet niet hoe mql4 in elkaar zit verder.

Acties:
  • 0 Henk 'm!

  • Cloud
  • Registratie: November 2001
  • Laatst online: 14:42

Cloud

FP ProMod

Ex-moderatie mobster

Ik ken de taal mql4 niet maar heb in een grijs verleden wel wat met C++ gedaan.

Even op de gok en met de aanname dat je alle source van je class hier toont; moet je in je Fiets-class niet aangeven dat je van de Wiel-class gebruik wilt maken? Een #include ofzo? Met andere woorden, is de fout niet zozeer dat je een declaratie doet zonder type maar eigenlijk dat het type wat je gebruikt in de declaratie niet bekend is op die positie?

Of is het juist het ontbreken van een 'new' keyword bij het instantiëren?

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


Acties:
  • 0 Henk 'm!

Verwijderd

Variabele2 moet zijn variabeleB? Wat verwacht je van wiel1 = wiel1(1)?

[ Voor 37% gewijzigd door Verwijderd op 04-09-2018 23:14 ]


Acties:
  • 0 Henk 'm!

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
Die was ik net aan het corrigeren, foutje uit m'n voorbeeld om het te versimpelen ;-)
Merethil schreef op dinsdag 4 september 2018 @ 23:06:
Normaalgesproken zou ik zeggen dat het moet zijn

code:
1
wiel1 = new Wiel(1);


Let op het keyword "new".
Dit is echter in de meeste talen zo, weet niet hoe mql4 in elkaar zit verder.
Initiëren met new kom ik verder niet tegen. Hoeft ook niet als ik een klasse Fiets initieer in m'n programma. Het gaat er echt om dat ik hem niet kan aanmaken in het declaratiestuk van Fiets. De error komt dus ook op de regel [code]Wiel wiel1;[code]

Zou dan met een include oid te maken kunnen hebben omdat hij binnen die klasse een Wiel niet kent. Ga ik even uitzoeken.

Acties:
  • 0 Henk 'm!

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Als je je code daadwerkelijk op deze manier hebt, schat ik dat dit ook een probleem is:

code:
1
2
wiel1 = wiel1(1);
wiel2 = wiel2(2);


wiel1 en wiel2 zijn geen functie's, methodes of constructors, dus dat gaat niet goed.

Anyways, iemand anders die ongeveer hetzelfde probleem had (volgens mij) heeft het opgelost door een pointer te gebruiken. Niet de netste oplossing, maar als je er daardoor mee verder kan...

edit: overigens is new wel een ding in mql4

[ Voor 15% gewijzigd door Gropah op 04-09-2018 23:34 ]


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 06:21
KappuhH schreef op dinsdag 4 september 2018 @ 23:14:
[...]
Die was ik net aan het corrigeren, foutje uit m'n voorbeeld om het te versimpelen ;-)
[...]

Initiëren met new kom ik verder niet tegen. Hoeft ook niet als ik een klasse Fiets initieer in m'n programma. Het gaat er echt om dat ik hem niet kan aanmaken in het declaratiestuk van Fiets. De error komt dus ook op de regel [code]Wiel wiel1;[code]

Zou dan met een include oid te maken kunnen hebben omdat hij binnen die klasse een Wiel niet kent. Ga ik even uitzoeken.
Het probleem echter is dat ik in de constructor van Fiets geen variabelen aan mag maken van het type Wiel, alleen de standaard int, bool, double, enz. Ik krijg dan de error 'declaration without type'.
Initiëren met new kom ik verder niet tegen. Hoeft ook niet als ik een klasse Fiets initieer in m'n programma. Het gaat er echt om dat ik hem niet kan aanmaken in het declaratiestuk van Fiets. De error komt dus ook op de regel
code:
1
Wiel wiel1;
Ah, dat had ik niet door, want de quote uit je TS gaf mij het gevoel dat het juist misging met de constructor.

Hoe dan ook, ik denk dat je inderdaad een include moet doen via https://docs.mql4.com/basis/preprosessor/include

Acties:
  • 0 Henk 'm!

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
Gropah schreef op dinsdag 4 september 2018 @ 23:22:
Als je je code daadwerkelijk op deze manier hebt, schat ik dat dit ook een probleem is:

code:
1
2
wiel1 = wiel1(1);
wiel2 = wiel2(2);


wiel1 en wiel2 zijn geen functie's, methodes of constructors, dus dat gaat niet goed.

Anyways, iemand anders die ongeveer hetzelfde probleem had (volgens mij) heeft het opgelost door een pointer te gebruiken. Niet de netste oplossing, maar als je er daardoor mee verder kan...

edit: overigens is new wel een ding in mql4
Lijkt inderdaad dat het met een pointer moet. Kom deze code tegen op een pagina van de mql4 documentatie (https://www.mql5.com/en/docs/basis/types/classes):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class CTetrisField 
  { 
private: 
   int               m_score;                            // Score 
   int               m_ypos;                             // Current position of the figures 
   int               m_field[FIELD_HEIGHT][FIELD_WIDTH]; // Matrix of the well 
   int               m_rows[FIELD_HEIGHT];               // Numbering of the well rows 
   int               m_last_row;                         // Last free row 
   CTetrisShape     *m_shape;                            // Tetris figure 
   bool              m_bover;                            // Game over 
public: 
   void              CTetrisField() { m_shape=NULL; m_bover=false; } 
   void              Init(); 
   void              Deinit(); 
   void              Down(); 
   void              Left(); 
   void              Right(); 
   void              Rotate(); 
   void              Drop(); 
private: 
   void              NewShape(); 
   void              CheckAndDeleteRows(); 
   void              LabelOver(); 
  };


Lijkt er op dat dit precies is wat ik nodig heb. Dacht dit al geprobeerd te hebben maar blijkbaar niet helemaal juist. Zal het vanavond thuis even opnieuw proberen.

Acties:
  • 0 Henk 'm!

  • expor
  • Registratie: Juni 2005
  • Laatst online: 01-10 22:53
Ik ben niet thuis in MQL maar als ik zo snel even Google zou de C++ stijl moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fiets
{
   private:
      int variableA;
      bool variableB;
      Wiel wiel1;
      Wiel wiel2;
   public:
      void Fiets(int A, bool B) :
         variableA(A),
         variableB(B),
         wiel1(1),
         wiel2(2)
      {
      };
      
      void DoeIets();
};

AMD 5800X3D | 16gb DDR 4 @ 3800/14 | 4070 Ti | 1TB Samsung Evo 970, 1TB Samsung Evo 860, 512MB Crucial


Acties:
  • 0 Henk 'm!

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
expor schreef op woensdag 5 september 2018 @ 11:42:
Ik ben niet thuis in MQL maar als ik zo snel even Google zou de C++ stijl moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Fiets
{
   private:
      int variableA;
      bool variableB;
      Wiel wiel1;
      Wiel wiel2;
   public:
      void Fiets(int A, bool B) :
         variableA(A),
         variableB(B),
         wiel1(1),
         wiel2(2)
      {
      };
      
      void DoeIets();
};
Deze manier geeft op regel 6 een error ivm decleration withouten type.

Acties:
  • 0 Henk 'm!

  • Raynman
  • Registratie: Augustus 2004
  • Nu online
Maar misschien komt dat doordat Wiel dan nog niet gedeclareerd is. Zie eerdere opmerking over #include.

Acties:
  • 0 Henk 'm!

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
Raynman schreef op woensdag 5 september 2018 @ 15:33:
Maar misschien komt dat doordat Wiel dan nog niet gedeclareerd is. Zie eerdere opmerking over #include.
Oh wat dom, ik moet de Wiel klasse natuurlijk wel voor de Fiets klasse zetten.

De volgende code lijkt te werken. (geeft in ieder geval geen compilation error, functionaliteit moet ik nog even checken).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Fiets
{
   private:
      int variableA;
      bool variableB; 
      Wiel *wiel1;
   public:
      void Fiets(int A, bool B) 
      {
         variableA = A;
         variableB = B;
         wiel1 = new Wiel(1);
      };
      void DoeIets();
};

  • KappuhH
  • Registratie: Augustus 2004
  • Niet online
Het lijkt allemaal te werken. Dank jullie wel!

Acties:
  • 0 Henk 'm!

  • g4wx3
  • Registratie: April 2007
  • Laatst online: 14:06
de implementatie kan volgens mij toch beter, door de wielen mee te geven aan de constructor. Depency injection. Dan kan je ook testen met slechte wielen, of ander soorten wielen, zolang ze maar wiel implementeren.

http://www.softfocus.be/


Acties:
  • 0 Henk 'm!

  • dogtagz
  • Registratie: December 2014
  • Laatst online: 03:27
Speaking of constructor, waar is deze?
Het object wordt niet aangemaakt als de klasse wordt aangeroepen. In C++ is dat dus wel nodig. Geen idee hoe dat met mql4 zit?

Een voorbeeld met de fiets klasse met jouw private variabelen en een standaard constructor(C++ stijl).


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "wiel.hpp"

class Fiets
{
   private:
      int variableA;
      bool variableB; 
      Wiel wiel1;
   public:
      
      Fiets(int A, bool B, Wiel wiel1) :
      variableA  ( A ),
      variableB ( B ),
      Wiel1 ( wiel1),
      { //hier voer ik dus niets uit bij het aanmaken van het object. Wat een gebruikelijke methode is. //}

      void DoeIets();
};


Wat de onderstaande code doet(per notatie even een cijfer toegevoegd).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Fiets
{
   private:
      int variableA;
      bool variableB; 
      Wiel *wiel1;       #1
   public:
      void Fiets(int A, bool B) 
      {                              #2
         variableA = A;       
         variableB = B;
         wiel1 = new Wiel(1);  #3
      };
      void DoeIets();
};


1. Hierbij gebruik je een pointer naar wiel1. Dit is dus een geheugenadres wat je wilt aanroepen. Heb je uberhaupt wiel wel geinclude dat hij deze kan aanroepen?

2. De krulhaakjes is code wat hij gaat uitvoeren bij de constructor. Is dit wel de manier hoe je een constructor maakt in mql4? Het voorbeeld daarboven staat hoe je een constructor in C++ maakt. Je assigned daar de waardes naar je private variablen die je meegeeft bij het aanroepen van de constructor.

3. Eerst gebruik je een pointer van wiel1, wat dus al aangemaakt moet zijn voordat je de constructor aanroept. Vervolgens moet de klasse fiets, de pointer gebruiken die je niet meegeeft als parameter?


Excuses voor deze late reactie, misschien kan je toch nog wat met deze informatie. Ik denk alleen dat het gebruik van pointers een beetje overbodig is..

[ Voor 6% gewijzigd door dogtagz op 25-09-2018 12:01 ]

$ alias cd='rm -rf'

Pagina: 1