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

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

1

29.09.2008, 19:06

[Erledigt] Konstruktorproblem

Hallo,
ich habe, seit einer Umstellung meines Quelltextes, ein Konstruktorenproblem.

Hier erstmal die Konstruktoren von unten nach oben:

C-/C++-Quelltext

1
2
3
4
5
6
CArmor::CArmor(CSprite* sprite, float animPhase, float xPos, float yPos)
: CBaseItem(sprite, animPhase, xPos, yPos)
{
    //g_pFramework->PlaySound("data/sounds/item_spawn.ogg");

    m_armor = rand() % 100;
}



C-/C++-Quelltext

1
2
3
4
5
CBaseItem::CBaseItem(CSprite* sprite, float animPhase, float xPos, float yPos)
: CBaseObject(sprite, animPhase, xPos, yPos)
{

}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
CBaseObject::CBaseObject(CSprite* sprite, float animPhase, float xPos, float yPos)
{
    m_sprite = sprite;
    m_animPhase = animPhase;
    m_xPos = xPos;
    m_yPos = yPos;
    m_isAlive = true;

    CreateRect(m_sprite);
}


An sich ist ja klar welchen Konstruktor er aufrufen müsste.

Nun aber die Konstruktorreihenfolge wie sie abgearbeitet wird:

C-/C++-Quelltext

1
2
3
4
5
6
CArmor::CArmor(CSprite* sprite, float animPhase, float xPos, float yPos)
: CBaseItem(sprite, animPhase, xPos, yPos)
{
    //g_pFramework->PlaySound("data/sounds/item_spawn.ogg");

    m_armor = rand() % 100;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
CBaseObject::CBaseObject()
{
    m_animPhase = 0.0f;
    m_xPos = 0.0f;
    m_yPos = 0.0f;
    m_isAlive = true;
}


Da ich leider mit meinem latein am ende bin, müsste ich auf euren Rat zurückgreifen, was da schief läuft.
Das Objekt von CArmor wird einfach nur auf dem Stack erstellt und in eine Liste eingefügt.

Ich habe die letzten 3 Tage mit Debuggen verbracht und bin nicht weitergekommen.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

29.09.2008, 19:32

Auch interessant wären die Klassendefinitionen.
@D13_Dreinig

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

3

29.09.2008, 19:35

ui okay.
Ich schieb sie gleich mal rein ^^

CBaseObject.hpp
http://rafb.net/p/4msV9395.html

CBaseItem.hpp
http://rafb.net/p/3PfpYE83.html

CArmor.hpp
http://rafb.net/p/y1XdPw82.html

Ich hoffe, die virtuelle Vererbung ist nicht zu schlimm.
Ich will nur verhindern, dass jemand auf die geniale Idee kommt, dass jemand doppelte Klassen in eine ableitet.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

29.09.2008, 19:37

Zitat von »"T-VIRUS"«


Ich hoffe, die virtuelle Vererbung ist nicht zu schlimm.


Doch, genau dass ist das Problem! Mir ist ohnehin schleierhaft warum man virtuell Vererbt ohne einen konkreten Grund zu haben...
@D13_Dreinig

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

29.09.2008, 20:15

@t-Virus soweit ich weiß nutzt man virtuell genau dazu um von einer Klasse zweimal ableiten zu können. Wenn du also verhindern willst, dass eine Basisklasse zweimal in einer Klasse auftritt, musst du nur das virtuell rauslassen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

6

29.09.2008, 20:19

Hallo,
okay ich werde das mal durchgehen.
Aber warum sollte er bei einer virtuellen Vererbung einen Konstruktor überspringen?

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

7

29.09.2008, 20:20

weil du ihm ja mit dem virtuel sagst, dass er das andere überschreiben soll..

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

29.09.2008, 20:22

Zitat von »"T-VIRUS"«

Hallo,
okay ich werde das mal durchgehen.
Aber warum sollte er bei einer virtuellen Vererbung einen Konstruktor überspringen?

MFG T-Virus


Tut er doch garnicht. Er ruft doch den Standardkonstruktor, genau wie erwartet, auf. Das einzige was nicht passiert ist der Konstruktoraufruf in der Initialisierungsliste von CBaseItem, wenn du unbedingt virtuelle Vererbung nutzen willst musst du den speziellen Konstruktor von CBaseObject halt jedesmal explizit aufrufen.

Aber wie gesagt. Lass das doch einfach mit der virtuellen Vererbung, wenn dus nich wirklich brauchst.

Zitat von »"Databyte"«

weil du ihm ja mit dem virtuel sagst, dass er das andere überschreiben soll..


:shock:
@D13_Dreinig

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

9

29.09.2008, 20:24

Hallo,
okay geht wieder ^^
Jetzt muss ich nur noch das Problem lösen, dass die Kollision nicht geht :/
Ich danke aber für die schnelle Hilfe :)

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

10

29.09.2008, 20:51

Zitat von »"Databyte"«

weil du ihm ja mit dem virtuel sagst, dass er das andere überschreiben soll..
Unwissender! :)

Bei einem virtual sagst du sicherlich nicht "überschreiben", sowas gibt es nur in C# und nennt sich "override".

http://www.schornboeck.net/ckurs/virtual.htm << Besser noch mal genau durchlesen. :)

So als "Heilige Faustregel" kann man sagen: Wenn man von einer Klasse ableiten darf, Destruktor immer virtual.

Apropos: Es gibt recht geile Fehler wenn man in boost shared_ptrs mit abgeleiteten Klassen verwendet und darauf einen Downcast ausführt, obwohl die Basisklasse einen nicht virtuellen d'tor hat. :) Aber das seht ihr ja in meinem nächsten Tutorial was passieren kann ;)

Werbeanzeige