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

19.06.2015, 00:35

C++ | Virtueller Konstruktor ?

Hallo Leute,

ich befasse mich seit kurzem mit SDL_2 (SDL_2 selbst ist hier irrelevant, aber verdeutlicht, was ich überhaupt vor habe) und habe nun eine Klasse erstellt, welche das Rendern für mich übernimmt,
Daten wiedergeben kann etc. (also praktisch meine Textur verwaltet).

Nun wollte ich eine Klasse erstellen mit welcher ich ebenfalls meine Texturen verwalten kann, allerdings soll ein anderer Teil dieser Textur eingeblendet werden je nachdem, ob man mit der Maus drüber ist, oder nicht.
Kein Problem dachte ich mir... vererbe ich doch einfach meine spitze Klasse Nr.1, welche praktisch alles kann und füge ihr zwei Variablen zum Prüfen hinzu, sowie einige Funktionen. Leider musste ich schnell feststellen, dass ich diese neuen Variablen beim erstellen aber nicht initialisieren kann, da virtuelle Konstruktoren anscheinend nicht möglich sind in C++. Wie umgehe ich das Problem, denn ich muss sie vor dem benutzen der Funktionen definitiv initialisieren und ist es überhaupt eine "vernünftige" Designentscheidung einer Klasse, welche etwas erbt weitere Variablen anzuhängen, oder wird das eigentlich nicht gemacht ?

Ich hoffe das Problem, welches ich habe geht aus dem Text hervor.
LG und vielen Dank bereits im Voraus :).

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

19.06.2015, 00:54

Ich verstehe das Problem nicht.

Kannst du mal mit Code beschreiben, wie du es gerne hättest, wenn es "virtuelle Konstruktoren" gäbe?

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

3

19.06.2015, 02:01

Ich glaube er meint so etwas:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class A {
    public:
        A(int x) {
            // ... 
        }
};

class B : public A {
    public:
        B(int x, int y) : A(x) { // initialization list (Basiskonstruktor Aufruf)
            // ...
        }
};


Edit: Die Konstruktoren von Basisklassen werden, wenn sie keine Argumente habe, automatisch aufgerufen.
:love: := Go;

4

19.06.2015, 05:24

Habe das Problem auch nicht wirklich überrissen, aber für mich hört sich das auch so an als ob du vielleicht nach einer Initialisierungsliste suchst/benötigst.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

5

19.06.2015, 08:07

Nach kurzer Recherche im Netz und euren Kommentaren wurde relativ schnell klar, dass ich eigentlich keine Ahnung habe wozu genau man virtual braucht und wann ich es weglassen sollte. :whistling:

Scheinbar kann ich den alten Konstruktor einfach überschreiben, richtig ? Ich hab' bisher alles sicherheitshalber mit virtual gemacht, was vererbt wurde und überschrieben werden sollte (damit ich sicher sein konnte, dass er die neuen Funktionen benutzt).
Beim zweiten mal überlegen keine sonderlich schlaue praxis, aber mehr als Heiko Kalistas "C++ für Spieleprogrammierer" habe ich noch nicht durchgearbeitet und dort wird die Verwendung von virtuellen Funktionen wie folgt beschrieben:

"Durch die Verwendung des Schlüsselwortes virtual direkt bei der Deklaration einer Memberfunktion gibt man an, dass damit zu rechnen ist, dass eine abgeleitete Klasse diese Funktion überschreiben wird."

Nun dachte ich wie oben bereits erwähnt, dass alles immer virtual sein sollte... :|

Eventuell könnte jemand klären, wann genau ich virtual verwenden sollte und wann es genug ist es nicht mit anzugeben.

Lg

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

19.06.2015, 08:27

Virtual brauchst du dann wenn Polymorphie im Spiel ist. Also z.B. wenn du einen Pointer eines bestimmten Typs hast, der aber auf ein Objekt eines abgeleiteten Typs zeigt. Ohne virtual wird die Funktion des Pointertyps aufgerufen, mit virtual die des Objekts auf das der Pointer zeigt.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

7

19.06.2015, 12:04

Ein virtueller Konstruktor macht logisch keinen Sinn, da die vtable noch nicht gefuellt sein kann, wenn der Konstruktor aufgerufen wird.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

19.06.2015, 14:13

Du sollst den Konstruktor der Basisklasse auch nicht überschreiben. Normalerweise würdest du einen neuen Konstruktor anlegen welcher dann den Konstruktor der Bassiklasse aufruft, so wie von H5:: beschrieben. Wenn du den Konstruktor einer Basisklasse denn wirklich überschreiben wollen würdest dann wäre das ein Anzeichen dafür dass der Konstruktor in der Basisklasse schlecht designet wurde.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

9

19.06.2015, 15:15

Ahja und die Vorgehensweise von H5 ist in diesem Falle korrekt ? Ich würde es sogar vorziehen nicht alles überschreiben zu müssen - muss ich die " : " mit angeben ? Er scheint bei mir auch ohne die zusätzlichen " : " stets den standard Konstruktor aufzurufen und anschließend den Neuen.

10

19.06.2015, 16:04

Scheinbar kann ich den alten Konstruktor einfach überschreiben, richtig ?

Hier wird irgendwie der Falsche Begriff verwendet, es wird nichts überschrieben, ich glaub Schorsch hat es schon gesagt der Konstruktor der BasisKlasse wird Initialisiert.

Ahja und die Vorgehensweise von H5 ist in diesem Falle korrekt ?

Ja. Er hat keinen StandardKonstruktor und muß in seinem Beispiel die Initialisierungsliste nutzen.

muss ich die " : " mit angeben ?

Wenn du eine Initialisierungsliste nutzt ja.

Er scheint bei mir auch ohne die zusätzlichen " : " stets den standard Konstruktor aufzurufen und anschließend den Neuen.

Ja aber auch nur dann wenn du einen StandardKonstruktor hast. Anderfalls musst du eine Initialisierungsliste nutzen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige