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

11

24.07.2011, 16:59

Ok, ich nutze den Thread mal gleich für mein nächstes Problem:

Ich möchte wie oben bereits gezeigt, eine Instanz einer Klasse erstellen, die von einer anderen Klasse erbt, wobei der Zeiger eben mit diese Klasse deklariert wird.
Nun soll dieser Intanz ein Name zugewiesen werden über eine Memberfunktion und danach ausgegenen werden:

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
#include <iostream>
#include <string>

using namespace std;

class C_Raumschiff
{
    public:
        string m_Name;
        void RaumschiffBenennen(C_Raumschiff *RaumschiffName);
};


class C_Jaeger: public C_Raumschiff
{
    public:
        int m_Energie;
};


void C_Raumschiff::RaumschiffBenennen(C_Raumschiff *RaumschiffName)
{
    string Name;
    cout << "Raumschff benennen: \n";
    cin >> Name;
    RaumschiffName->m_Name = Name;
}


int main()
{
    C_Raumschiff *MeinRaumschiff = NULL;
    MeinRaumschiff = new C_Jaeger;

    MeinRaumschiff->RaumschiffBenennen(MeinRaumschiff);
    cout << "Name des Raumschiffes: \n";
    cout << MeinRaumschiff->m_Name;
}


Klappt auch erstmal.
Nur möchte ich jetzt das Benennen in einer weiteren nicht Memberfunktion stattfinden lassen.
Dieser Funktion wird als Argument der entsprechende Zeiger übergeben, jedoch ändert dieser nicht seine Werte.
Nur der Zeiger innerhalb der Funktion verändert seine Werte, diese werden jedoch nicht übergeben.
Ich bin ehrlich gesagt an dieser Stelle ratlos :( :

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
#include <iostream>
#include <string>

using namespace std;



class C_Raumschiff
{
public:
    string m_Name;
    void m_RaumschiffBenennen(C_Raumschiff *RaumschiffName);
};


class C_Jaeger: public C_Raumschiff
{
public:
    int m_Energie;

    C_Jaeger()
    {
        m_Energie = 100;
        cout << "Jaeger erstellt" << endl;
    }
};



void C_Raumschiff::m_RaumschiffBenennen(C_Raumschiff *RaumschiffName)
{
    cout << "Raumschiff benennen" << endl;
    string Name;
    cin >> Name;
    RaumschiffName->m_Name = Name;
}
void RaumschiffErstellen(C_Raumschiff *NeuesRaumschiff)
{
    NeuesRaumschiff = new C_Jaeger;
    NeuesRaumschiff->m_RaumschiffBenennen(NeuesRaumschiff);
}


int main()
{
    C_Raumschiff *MeinRaumschiff = NULL;
    RaumschiffErstellen(MeinRaumschiff);

    cout << "Name vom Raumschiff: ";
    cout << MeinRaumschiff->m_Name << endl;
}


Nächste Frage, ich weiß dass es auf normalen Weg nicht geht, aber wie greife ich auf die Membervariable m_Energie zu?

12

24.07.2011, 17:13

Oh, also der Parameter der Memberfunktion ist eigentlich sinnlos. Mach sie entweder statisch, sodass du dafür kein Objekt brauchst und lass den Parameter, oder, wie ich es machen würde, entferne einfach den Parameter und benenn immer das Objekt, dessen Funktion du gerade aufrufst:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Raumschiff
{
public:
    string name;
    void benennen()
    {
        cin >> name;
    }
};

int main()
{
    Raumschiff schiff;
    schiff.benennen();
    cout << schiff.name;
}


Zu deinem eigentlichen Problem mit dem Erstellen: Da du ja den Zeiger neu setzt aber in der Funktion immer nur eine Kopie hast, musst du einen Zeiger auf den Zeiger übergeben.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void erstellen(Raumschiff** schiff)
{
    *schiff = new Jaeger;
    (*schiff)->benennen();
}

int main()
{
    Raumschiff* schiff;
    erstellen(&schiff);
    cout << schiff->name;
}


Drittes Problem: Da Energie ein Member von Jaeger ist, musst du auch einen Zeiger auf einen solchen haben.

C-/C++-Quelltext

1
2
3
4
5
6
// Beispiel:
Raumschiff* schiff = new Jaeger;
((Jaeger*)schiff)->energie = 100;
// Oder gleich:
Jaeger* schiff = new Jaeger;
schiff->energie = 100;

Wieso hat ein Raumschiff keine Energie? Der Jaeger sollte diesen Member gleich von Raumschiff erben, dann wäre es logischer und einfacher.

13

24.07.2011, 18:34

Zitat

Oh, also der Parameter der Memberfunktion ist eigentlich sinnlos. Mach sie entweder statisch, sodass du dafür kein Objekt brauchst und lass den Parameter, oder, wie ich es machen würde, entferne einfach den Parameter und benenn immer das Objekt, dessen Funktion du gerade aufrufst:
Hat ich glatt vergessen, hier war ich mir nicht sicher wie es richtig ist :D .
Ich werd mal gucken was mir besser gefällt.

Zitat

Zu deinem eigentlichen Problem mit dem Erstellen: Da du ja den Zeiger neu setzt aber in der Funktion immer nur eine Kopie hast, musst du einen Zeiger auf den Zeiger übergeben.
Ok, danke dafür :thumbup:
Wird gleich ausprobiert.

Zitat

Wieso hat ein Raumschiff keine Energie? Der Jaeger sollte diesen Member gleich von Raumschiff erben, dann wäre es logischer und einfacher.
Mit Energie meinte ich sowas wie Laserenergie für Geschosse, hätt ich vielleicht im Beispiel auch so benennen sollen :whistling:
(Da ich auch Raumschiffe erstellen möchte, die sowas nicht besitzen sollen.)
Spielt hier aber keine Rolle, der Code sollte auch nicht logisch sein sonder zeigen, was ich meinte ^^ .

Edit: Funktioniert alles :thumbsup:
Angenommen jetzt aber, es ist zur Laufzeit noch nicht bekannt, welchen Typ das Raumschiff später haben soll,
wie mach ich das dann?
Muss ich hier eine if oder switch Bedingung einfügen?
Kann ich das hier

Zitat

C-/C++-Quelltext
1 2 3 4 5 6
// Beispiel: Raumschiff* schiff = new Jaeger; ((Jaeger*)schiff)->energie = 100; // Oder gleich: Jaeger* schiff = new Jaeger; schiff->energie = 100;

Auch einmalig machen für einen Zeiger?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Rexona for men« (24.07.2011, 18:50)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

14

24.07.2011, 18:51

Mit Energie meinte ich sowas wie Laserenergie für Geschosse, hätt ich vielleicht im Beispiel auch so benennen sollen :whistling:
(Da ich auch Raumschiffe erstellen möchte, die sowas nicht besitzen sollen.)
Spielt hier aber keine Rolle, war nur zum Zeigen, was ich meinte. Der Code sollte auch nicht logisch sein sonder zeigen, was ich meinte ^^ .

In welchen Situationen musst du von außen auf die Energiewaffenenergie zugreifen? Ich denk nicht, dass du es brauchst.

Wie wäre es wenn du dich ein bisschen mit Polymorphie (genauer virtuellen Methoden) beschäftigst bevor du mit Zeigern auf die Basisklasse arbeitest?

edit: Achja, bitte den angeforderten Speicher auch in Beispielen freigeben. Das muss sich ins Gehirn einbrennen!
"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?

15

24.07.2011, 19:03

Zitat

In welchen Situationen musst du von außen auf die Energiewaffenenergie zugreifen? Ich denk nicht, dass du es brauchst.
Ohja, das hätte eigenlich private sein müssen :whistling: .

Zitat

Wie wäre es wenn du dich ein bisschen mit Polymorphie (genauer virtuellen Methoden) beschäftigst bevor du mit Zeigern auf die Basisklasse arbeitest?
Ich war auf die Idee gekommen, den Raumschifftyp erst zur Laufzeit festlegen zu müssen, aber ja, mit virtuellen Methode muss ich aufjedenfall auch noch was machen :whistling: .

Zitat


edit: Achja, bitte den angeforderten Speicher auch in Beispielen freigeben. Das muss sich ins Gehirn einbrennen!
Ups, nächstes Mal denk ich dran, versprochen!

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

16

24.07.2011, 19:51

Zitat

In welchen Situationen musst du von außen auf die Energiewaffenenergie zugreifen? Ich denk nicht, dass du es brauchst.
Ohja, das hätte eigenlich private sein müssen :whistling: .

Ich bezog mich auf diese Frage:
Nächste Frage, ich weiß dass es auf normalen Weg nicht geht, aber wie greife ich auf die Membervariable m_Energie zu?
"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?

17

24.07.2011, 20:43

Das war in dem Fall nur ein Beispiel, ich wollte wissen wie man allgemein auf Membervariablen und Memberfunktionen zugreift wenn man einen Zeiger als Instanz einer Klasse hat und dieser auf eine Instanz einer Klasse zeigt, die von der ersten Klasse erbt.
Der Code sollte nicht sinnig sein :D

Werbeanzeige