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

Meandor

Frischling

  • »Meandor« ist der Autor dieses Themas

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

1

06.01.2006, 16:56

Das alte Zeiger Problem!

Guten Tag!

Ich habe ein Problem mit den Zeigern auf Klassen. Ähnlich wie Spacegaier gestern abend geschrieben hat. Ich hatte eigentlich gedacht das ich das verstanden hätte aber im Buch vom Heiko werden dabei lediglich Beispiele vorgestellt wo dies innerhalb einer Datei passiert bzw. die Membervariablen public sind. (Was ja auch nicht im Sinne des Erfinders ist)

Aufgabenstellung:
Ich möchte 2 Raumschiff Instanzen in einer anderen Datei verändern.
Und das ganze mittels Zeiger (über die Instanz Adressen).

Wieso klappt das so nicht? Hier mein Quelltext: (Läßt sich übersetzen zeigt aber nicht die gewünschte Wirkung!)

Ich habe 3 cpp Dateien und 2 Header Dateien:

haupt.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include "CRaumschiff.h"
#include "Funktion.h"

using namespace std;

int main()
{
    CRaumschiff Normalergegner; 
//Es werden zwei Raumschiff Instanzen erzeugt

    CRaumschiff Endgegner; 
//Jetzt wird ein Raumschiff auf dem Stack erzeugt mit Namen Endgegner er besitzt normaler Weise beim erzeugen 1000 Lebenspunkte

    cout<<"Adresse des Endgegners : "<<&Endgegner<<endl; //Ausgabe der Adresse des Endgegners

    cout<<"Der Endgegner hat die Lebensenergie von : "<<Endgegner.Zeige_Energie()<<endl;//Ausgabe der Lebenspunkte des Endgegners ist das so richtig?? oder mittels :: oder ->?????

    Funktion_Lebensenergie_aendern(&Endgegner); //Aufruf der Funktion mit der Adresse des Endgegners um diesmal die Lebensenergie des Endgegners zu verändern  

    cout<<"Der Endgegner hat nun eine Lebensenergie von : "<<Endgegner.Zeige_Energie()<<endl;//Ausgabe der Lebensenergie


    return 0;
}


CRaumschiff.cpp

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
#include "CRaumschiff.h"
#include <iostream>

using namespace std;

CRaumschiff::CRaumschiff()
{
    cout<<"Neues Raumschiff erstellt!"<<endl;
        m_Energie=1000;
        m_Team=1;
}
CRaumschiff::~CRaumschiff()
{
    cout<<"Raumschiff zerstoert!"<<endl;
}
CRaumschiff::Setze_Energie (int Energie)
{
    m_Energie = Energie;
}
CRaumschiff::Setze_Team (int Team)
{
    m_Team = Team;
}
CRaumschiff::Zeige_Energie()
{
    cout<<"Die Energie des Raumschiffs ist!"<<m_Energie<<endl;
}
CRaumschiff::Zeige_Team()
{
    cout<<"Das Raumschiff ist im Team: "<<m_Team<<endl;
}
CRaumschiff::Energie_subtrahieren(int Verletzung)
{
    m_Energie -= Verletzung;
}


Funktion.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
#include "Funktion.h"
#include "CRaumschiff.h"


void Funktion_Lebensenergie_aendern(CRaumschiff *pZeiger)
{
    pZeiger->Setze_Energie(500);
}


CRaumschiff.h

C-/C++-Quelltext

1
2
3
4
5
6
7
#ifndef __Funktion
#define __Funktion

#include "CRaumschiff.h"
void Funktion_Lebensenergie_aendern(CRaumschiff *pZeiger);

#endif


CRaumschiff.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef _CRaumschiff
#define _CRaumschiff


class CRaumschiff 
{
    private:
        int m_Energie;
        int m_Team;
    public:
        CRaumschiff();
        ~CRaumschiff();
        Setze_Energie(int Energie);
        Setze_Team (int Team);
        Zeige_Energie();
        Zeige_Team();
        Energie_subtrahieren(int Verletzung);
};
#endif


könnte man vielleicht mal ein kleines Beispiel schreiben wie man dabei vorgehen sollte?
In der main() muss ich ja dem Compiler verständlich machen auf welche Instanz ich mich beziehen will also über die Adressen mittels Zeiger.
Dazu benötigt ja die Funktion ja auch schon die Klasse der Raumschiffe da ich ja sonst keinen Zeiger wie (void Funktion_Lebensenergie_aendern(CRaumschiff *pZeiger) erzeugen kann benötigt ja die Klasse der Raumschiffe.

Mit bestem Gruß
Jens

Ich hoffe das könnte vielleicht einmal jemand klären also aus dem Buch vom Heiko kommt das nicht wirklich gut hervor.

Sicaine

unregistriert

2

06.01.2006, 17:05

Quellcode

1
2
    CRaumschiff Normalergegner;
//Es werden zwei Raumschiff Instanzen erzeugt


Nö du definierst sie nur. Müsste doch bei Heikos Buch irgendwo was von new stehen oder?

Meandor

Frischling

  • »Meandor« ist der Autor dieses Themas

Beiträge: 55

Wohnort: Oberhausen

Beruf: Student

  • Private Nachricht senden

3

06.01.2006, 17:57

habe den Fehler selber entdeckt den ich gemacht habe. Es wäre nur sinnvoller eine public Funktion in der Klasse CRaumschiff zu schreiben

C-/C++-Quelltext

1
2
3
4
int CRaumschiff::Zeige_Energie_Ausgabe()
{
    return m_Energie;
}


diese sollte man dann besser in main() aufrufen mit

C-/C++-Quelltext

1
cout<<"Der Endgegner hat die Lebensenergie von : "<<Endgegner.Zeige_Energie_Ausgabe()<<endl;

denn ansonsten war alles richtig gemacht worden, denn die Funktion in der separaten Datei verändert die Membervariablen der Instanz die übergeben wird.

Klar kann man sich die Instanzen auch auf dem Heap erzeugen aber die muss ich doch auch mittels Adressen übergeben.

Sicaine

unregistriert

4

06.01.2006, 19:39

Das meint ich eigentlich nicht. Dachte du hättest nen zeiger definiert. Hab nur drübergeguckt und hast auch noch gefragt ob du nich -> verwenden solltest.

5

25.01.2006, 02:13

Zitat von »"Sicaine"«

Quellcode

1
2
    CRaumschiff Normalergegner;
//Es werden zwei Raumschiff Instanzen erzeugt


Nö du definierst sie nur. Müsste doch bei Heikos Buch irgendwo was von new stehen oder?


meinst du nicht deklariert?
schließlich bennent er an der stelle nur diese zwei instanzen..
never send a human to do a machines job.

6

25.01.2006, 14:06

Ich glaube, bei "Pointerklassen" muss man -> verwenden, um auf Members der Klasse zugreifen zu können, oder?

F0GX

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

7

25.01.2006, 16:21

ja
Was es alles gibt, das ich nich brauche - Aristoteles

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

8

25.01.2006, 17:52

aber es sind halt keine pointer ;)

Werbeanzeige