Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

XelVair

Frischling

  • »XelVair« ist der Autor dieses Themas

Beiträge: 46

Beruf: Student

  • Private Nachricht senden

1

11.02.2010, 19:00

[C++] Memberfunktion auf einmal nicht deklariert?

Schönen guten Abend Spieleprogramierer.de Community^^

Ich habe mich kürzlich (also eigentlich gerade eben ;) ) mit der Vererbung beschäftigt, klappte sehr gut...als ich dann aber per Speicherreservierung die Klasse erzeugen wollte, verstand ich (und der Compiler ) die Welt nichtmehr.

Den Code hab ich hier für euch vereinfacht hingeschrieben:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <conio.h>
#include <iostream>

using namespace std;

//Erstmal die Standardklasse deklarieren

class stdClass
{
protected:
          int Membervariable;
public:
          void Memberfunktion()
          {
          cout << "Membervariable aufgerufen!" << endl;    
          }              
};

//Jetzt kommt die Modifizierte stdClass an die Reihe

class KlasseMitErbgut : stdClass
{
protected:
          int ZweiteMemvervariable;
public:
          void ZweiteMemberfunktion()
          {
          cout << "ZweiteMemberfunktion aufgerufen!" << endl;   
          }  
          
          KlasseMitErbgut()
          {
          stdClass();
          Membervariable = 2;
          int ZweiteMembervariable = 3;                 
          }
};

int main()
{
    KlasseMitErbgut *pTestklasse = new KlasseMitErbgut;
    pTestklasse.ZweiteMemberfunktion();                // 'ZweiteMemberfunktion' has not been declared

    getch();                                           // request for member of non-aggregate type before '(' token

    return 0;
}


Ich hoffe mein Problem ist leicht ersehbar...ich habe im Moment nicht viel zeit zum erklären.

Danke im Voraus!
Ich bin eine Siegnatur, ihr kriegt mich nicht unter!

2

11.02.2010, 19:08

Du rufst im Konstrukur den Konstruktor der stammklasse auf, dies ist falsch. Auch empfehle ich dir einen virtuellen destruktor für die stammklasse.

Mastermind

unregistriert

3

11.02.2010, 19:11

Quellcode

1
2
KlasseMitErbgut *pTestklasse = new KlasseMitErbgut;
pTestklasse.ZweiteMemberfunktion();


Statt . -> benutzen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

11.02.2010, 19:26

Zitat von »"HighligerBimBam"«

Du rufst im Konstrukur den Konstruktor der stammklasse auf, dies ist falsch. Auch empfehle ich dir einen virtuellen destruktor für die stammklasse.

jup.
wenn du einen konstruktor mit parametern hast sollte es so aussehen:

Quellcode

1
2
3
4
5
6
KlasseMitErbgut()
: stdClass()
          {
          Membervariable = 2;
          int ZweiteMembervariable = 3; // <-- hier ist übrigens nochn fehler, du verdeckst die membervariable            
          } 
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

5

11.02.2010, 20:00

So wäre es mit allen Vorschlägen richtig:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <conio.h> 
#include <iostream> 

using namespace std; 

//Erstmal die Standardklasse deklarieren 

class stdClass 
{ 
protected: 
          int Membervariable; 
public: 
          void Memberfunktion() 
          { 
          cout << "Membervariable aufgerufen!" << endl;    
          }

          virtual ~stdClass() {} //brauchst du momentan nicht aber sobald du einen destruktor in  KlasseMitErbgut hast

}; 

//Jetzt kommt die Modifizierte stdClass an die Reihe 

class KlasseMitErbgut : stdClass 
{ 
protected: 
          int ZweiteMemvervariable; 
public: 
          void ZweiteMemberfunktion() 
          { 
          cout << "ZweiteMemberfunktion aufgerufen!" << endl;    
          }  
          
          KlasseMitErbgut() 
          { //hier nicht den Konstruktor der Stammklasse aufrufen

          Membervariable = 2; 
          ZweiteMembervariable = 3;                  // nicht nochmal deklarieren, ist doch schon deklariert!

          } 
}; 

int main() 
{ 
    KlasseMitErbgut *pTestklasse = new KlasseMitErbgut; 
    pTestklasse->ZweiteMemberfunktion();                // pfeil statt punkt!

    getch();                                           
    return 0; 
}

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

11.02.2010, 20:25

Nein, eher so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>

//using namespace std; // nein, ganz sicher nicht in einem Header


//Erstmal die Standardklasse deklarieren

class stdClass
{
//protected // Kapselung ist auch bei Vererbung erwünscht

private:  
    int Membervariable;

public:

    explicit stdClass ( int n = 0) 
        : Membervariable ( n ) 
    {}

    void SetMember ( int m ) { Membervariable = m; }  // setter und getter. Aber die bräuchtest du hier nicht mal

    int GetMember () const { return Membervariable; }

    void Memberfunktion()
    {
        std::cout << "Membervariable aufgerufen!" << std::endl;   
    }

    virtual ~stdClass() {}
};

class KlasseMitErbgut : public stdClass
{
private:
    int ZweiteMemvervariable;
    
public:

    void SetMember ( int m ) { ZweiteMemvervariable = m; }
    int GetMember () const { return ZweiteMemvervariable; }

    void ZweiteMemberfunktion()
    {
        std::cout << "ZweiteMemberfunktion aufgerufen!" << std::endl;   
    } 
         
    KlasseMitErbgut()
        : stdClass ( 2 ), // aufruf des Basiskonstruktors

    ZweiteMemvervariable ( 3 ) // initialisierung

    {}
};

int main()
{
    KlasseMitErbgut *pTestklasse = new KlasseMitErbgut;
    pTestklasse->ZweiteMemberfunktion();                
    delete pTestklasse; // nicht vergessen!


    return 0;
} 

7

11.02.2010, 20:35

Überredet.

Mastermind

unregistriert

8

11.02.2010, 20:37

Zitat

// Kapselung ist auch bei Vererbung erwünscht


Kapselung impliziert auch dass man nicht "auf Verdacht" für alles get und set mitliefert, sondern nur dort wo es wirklich benötigt wird.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

11.02.2010, 20:42

Zitat von »"Mastermind"«

Zitat

// Kapselung ist auch bei Vererbung erwünscht


Kapselung impliziert auch dass man nicht "auf Verdacht" für alles get und set mitliefert, sondern nur dort wo es wirklich benötigt wird.


Wer hat denn sowas behauptet?

XelVair

Frischling

  • »XelVair« ist der Autor dieses Themas

Beiträge: 46

Beruf: Student

  • Private Nachricht senden

10

11.02.2010, 21:51

Ok dann ist das Ganze komplizierter als ich dachte...

Werde mich nochmal in das Kapitel einlesen und dass ganze dann (hoffentlich) verstehen.

Vielen Dank an die Poster!^^

PS: Bevor ich es vergesse, ich verstehe den Unterschied zwischen dem . und dem -> Operator nicht ganz, wenn einer so freundlich wäre mir das kurz zu erklären... ich wäre demjenigen sehr dankbar^^


PS2:

Zitat von »"drakon"«

C-/C++-Quelltext

1
int GetMember () const { return Membervariable; }

Was bewirkt der "const" in der funktion? =o
Ich bin eine Siegnatur, ihr kriegt mich nicht unter!

Werbeanzeige