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

1

30.08.2012, 17:37

Funktionsaufruf mit Klasse funktioniert nicht

Hallo Leute,
ich habe folgendes Problem: Ich habe mir ein Programm geschrieben, dass einen Diebstahl simulieren soll, d.h. wenn ein Spieler von einem anderen klaut dann bekommt er das Geld von ihm und der Gegenspieler verliert sein Geld. Dazu habe ich mir eine Klasse für die Personen erstellt und habe mir mit einem Zeiger Instanzen davon erzeugt, um das zu üben. Jetzt gibt der Compiler aber eine Fehlermeldung aus, dass links neben der Funktion ein Klasse stehen muss. Und da steht auch mein Instanz der Klasse, die ich erstellt habe aber der Compiler will es einfach nicht kompilieren. Hier ist der Quelltext und die Fehlermeldung:
Quelltext:

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment (lib, "winmm.lib")

class CMensch
{
    // Membervariablen
    private:

        int m_Geld;

    // Memberfunktionen
    public:

        CMensch ();
        void Diebstahl (CMensch Person);
        int Ausgeraubt ();

}; // CMensch

// Konstruktor
//
CMensch::CMensch ()
{
    // Zufallsgenerator initialisieren
    srand (timeGetTime ());

    // Zufallszahl festlegen

    m_Geld = (rand()%300)+1;

    // Geld ausgeben
    cout << "Geld nach start: " << m_Geld << endl;
}

// void Diebstahl
//
void CMensch::Diebstahl (CMensch Person)
{
    cout << "Sie beklauen ihren Gegner" << endl;
    m_Geld += Person.Ausgeraubt ();
    cout << "Ihr Geld beträgt " << m_Geld << " Taler" << endl;
}

// void Ausgeraubt
//
int CMensch::Ausgeraubt ()
{
    return m_Geld;

    m_Geld = 0;
}

// Hauptprogramm
//
int main ()
{
    // Variablen
    CMensch *pSpieler = NULL;
    CMensch *pGegner = NULL;

    // Speicher reservieren
    pSpieler = new CMensch;
    pGegner = new CMensch;

    // Beklauen
    pSpieler.Diebstahl (pGegner);

    // Speicher freigeben
    delete pSpieler;
    pSpieler = NULL;

    delete pGegner;
    pGegner = NULL;

    return 0;
}


Fehlermeldung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
1>------ Erstellen gestartet: Projekt: KlauSystem, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>Klau_System.cpp
1>c:\users\...\documents\visual studio 2008\projects\klausystem\klau_system.cpp(72) : error C2228: Links von ".Diebstahl" muss sich eine Klasse/Struktur/Union befinden.
1>        Typ ist 'CMensch *'
1>        Wollten Sie stattdessen '->' verwenden?
1>Das Buildprotokoll wurde unter "file://c:\Users\...\Documents\Visual Studio 2008\Projects\KlauSystem\Debug\BuildLog.htm" gespeichert.
1>KlauSystem - 1 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

2

30.08.2012, 17:41

C-/C++-Quelltext

1
pSpieler->Diebstahl (pGegner);

... Obwohl die Fehlermeldung des Compilers ja schon alles sagt... :rolleyes:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

30.08.2012, 17:43

Der Compiler sagt dir doch schon, was das Problem ist. pSpieler ist ein Zeiger auf einen CMensch und nicht selbst ein CMensch. Um zu deinem CMensch Objekt zu gelangen, musst du den Zeiger dereferenzieren, also (*CMensch).methode();
Kurzschreibweise: CMensch->methode();...

4

30.08.2012, 17:43

Ja ich weiß das dort der Fehler hängt aber links vor .Diebstahl steht doch eine Klasse.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

30.08.2012, 17:44

Nein, links vor .Diebstahl steht ein Zeiger auf ein Objekt... ;)

Edit: Btw, das Nullsetzen der Zeiger nach dem delete ist hier ziemlich sinnlos und Libraries sollte man imo über den regulären Weg, nämlich die entsprechenden Linkereinstellungen, einbinden, anstatt #pragma comment zu benutzen.

6

30.08.2012, 17:48

@dot so kam aber auch eine Fehlermeldung und im Buch gibt es ein Beispeil das nach dem gleichen Prinzip verläuft und da ist keine Fehlermeldung.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

30.08.2012, 17:49

Und was für eine Fehlermeldung kommt dann? Und wie genau sieht der Code aus, mit dem du's versucht hast? Der Code ist, so wie er da oben steht, jedenfalls einfach nicht richtig und dass das Beispiel im Buch funktioniert, wird daran nichts ändern...

8

30.08.2012, 17:51

Als Fehlermeldung kommt dann, dass es eine Ungültige Dereferenzierung wäre.

So sieht der Quellcode aus:

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Klau System
//
#include <iostream>
#include <windows.h>

using namespace std;

#pragma comment (lib, "winmm.lib")

class CMensch
{
    // Membervariablen
    private:

        int m_Geld;

    // Memberfunktionen
    public:

        CMensch ();
        void Diebstahl (CMensch Person);
        int Ausgeraubt ();

}; // CMensch

// Konstruktor
//
CMensch::CMensch ()
{
    // Zufallsgenerator initialisieren
    srand (timeGetTime ());

    // Zufallszahl festlegen

    m_Geld = (rand()%300)+1;

    // Geld ausgeben
    cout << "Geld nach start: " << m_Geld << endl;
}

// void Diebstahl
//
void CMensch::Diebstahl (CMensch Person)
{
    cout << "Sie beklauen ihren Gegner" << endl;
    m_Geld += *Person.Ausgeraubt ();
    cout << "Ihr Geld beträgt " << m_Geld << " Taler" << endl;
}

// void Ausgeraubt
//
int CMensch::Ausgeraubt ()
{
    return m_Geld;

    m_Geld = 0;
}

// Hauptprogramm
//
int main ()
{
    // Variablen
    CMensch *pSpieler = NULL;
    CMensch *pGegner = NULL;

    // Speicher reservieren
    pSpieler = new CMensch;
    pGegner = new CMensch;

    // Beklauen
    *pSpieler.Diebstahl (pGegner);

    // Speicher freigeben
    delete pSpieler;
    pSpieler = NULL;

    delete pGegner;
    pGegner = NULL;

    return 0;
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

30.08.2012, 17:56

Der . Operator bindet stärker als der * Operator. Was du dort also effektiv stehen hast ist: *(pSpieler.Diebstahl) (pGegner);

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

10

30.08.2012, 17:57

Ja, weil von der Priorität her rechts vor links geht.

Du versuchst den Rückgabewert einer void-Funktion zu dereferenzieren, kein Wunder, dass er dir einen Fehler gibt.

Entweder, du benutzt (*pSpieler).Diebstahl(pGegner) oder pSpieler->Diebstahl(pGegner), kann doch nicht so schwer sein, die gegebenen Antworten ordentlich (in dem Fall sogar über Copy&Paste) umzusetzen...
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige