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

06.10.2015, 20:26

[C++] Probleme mit abstrakter Klasse, vererbung

Hallo,
ich habe ein Problem mit dem folgenden Programm:

Quellcode

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

using namespace std;

class GameObject {
protected:
    int x, y;
    //...
public:
    virtual void render() = 0;
};

class Player : public GameObject {
public:
    void render() {
        cout << "render" << endl;
    }
};

class Handler {
private:
    list<GameObject> List;

public:
    Handler() {
        List.push_back(Player());
    }

    void render() {
        for (list<GameObject>::iterator i = List.begin(); i != List.end(); i++) {
            i->render();
        }
    }
};

int main() {

    Handler handler;
    handler.render();

return 0;
}


Das ist jetzt nur ein Minimalbeispiel, aber mein Ziel ist es, eine Klasse (Handler) zu schreiben, die eine Liste von Objekten durchläuft und deren Funktionen (hier render()) aufruft.
Inhalt der Liste sollen Instanzen verschiedener Klassen sein (z.b. Player, Enemy, ...). Sie alle erben von der Klasse GameObject bzw. Object.
Dort werden dann auch die Funktionen aus Object definiert (in diesem Fall render(), Zeile 16).
Hier ist alles noch schlicht gehalten, aber Object soll später grundlegenden Sachen beinhalten, die ein Objekt in einem Spiel benötigt (Koordinaten, Den Typ

Quellcode

1
enum Type{Player, Enemy}
, usw.)

Aber wie mache ich das? Ich habe es bereits in etwa so wie oben beschrieben in Java gemacht, aber wie mache ich es in C++?
Oder gibt es eine Alternative?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tucker« (21.10.2016, 02:24)


cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

2

06.10.2015, 20:30

Mir fällt als erstes auf, dass du in Zeile 16 gar nicht die Funktion überschreibst, da kein override nach void render() steht. Ist das beabsichtig?

3

06.10.2015, 20:39

Huch, dass habe ich wohl vergessen :pinch:
Danke.
Allerdings habe ich immer noch folgendes Problem:
Fehler C2259 "GameObject": Instanz von abstrakter Klasse kann nicht erstellt werden
Wie genau behebe ich das?

4

06.10.2015, 20:46

Mir ist klar, dass ich in Zeile 23 den Fehler einbaue. Funktioniert natürlich nicht, aber wie könnte es funktionieren?

5

06.10.2015, 20:57

Sehr schön, läuft perfekt!
Viele Dank für die schnellen Antworten!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.10.2015, 21:08

Besser wäre wohl vector<unique_ptr<GameObject>> gewesen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

7

06.10.2015, 21:10

Mir fällt als erstes auf, dass du in Zeile 16 gar nicht die Funktion überschreibst, da kein override nach void render() steht. Ist das beabsichtig?

Ein fehlendes override hat damit nichts zu tun. Das Keyword override wurde mit C++11 eingeführt und bringt "lediglich" einen weiteren Compilercheck. Zum Überschreiben reicht es aus, die Funktion in der Basisklasse als virtual zu deklarieren und in der Subklasse eine Methode mit derselben Signatur zu definieren.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

cojo2015

Alter Hase

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

06.10.2015, 21:16

Mir fällt als erstes auf, dass du in Zeile 16 gar nicht die Funktion überschreibst, da kein override nach void render() steht. Ist das beabsichtig?

Ein fehlendes override hat damit nichts zu tun. Das Keyword override wurde mit C++11 eingeführt und bringt "lediglich" einen weiteren Compilercheck. Zum Überschreiben reicht es aus, die Funktion in der Basisklasse als virtual zu deklarieren und in der Subklasse eine Methode mit derselben Signatur zu definieren.
Ah ok, danke für die Info. Man lernt halt immer mehr dazu ^^

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

06.10.2015, 21:25

Ja, natürlich. Wenn jemand ein Objekt löscht, was ihm nicht gehört, ist das ein semantischer Fehler, der im besten Fall zum Absturz führt. Ein "delete" sollte es seit C++11 in keinem Code mehr geben. Wenn Du einen unique_ptr vor dem Ende des Scopes von seinem Inhalt befreien willst, dann weist Du ihm nullptr zu.

Wenn Du einen Zyklus von einem unique_ptr auf seinen Owner erstellst, ist das ebenfalls ein semantischer Fehler und führt zu doppelter Freigabe. Richtig dumm kommt es, wenn das Objekt selbst im Stack liegt:
int x = 5; std::unique_ptr<int> faulty(&x);
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (06.10.2015, 21:31)


Werbeanzeige