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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

04.07.2011, 01:20

Ok gut, ist ja auch egal, denn das tut für die Frage hier eigentlich nicht viel zur Sache. Deine Typprüfung passiert nämlich zur Compiletime und nicht zur Laufzeit. Es gibt übrigens einen ziemlich genialen Trick wie man zur Compiletime automatisch feststellen kann ob eine Klasse von einer anderen abgeleitet ist (vielleicht nützts dir ja was, funktioniert aber nur wenn die Klasse public erbt):

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

template <class T, class Base>
struct IsDerived
{
private:
  IsDerived();

  typedef char small;
  struct big { char blub[2]; };

  static T makeT();
  static small test(const Base&);
  static big test(...);

public:
  static const bool value = sizeof(test(makeT())) == sizeof(small);
};

class A {};
class B : public A {};

int main()
{
  std::cout << IsDerived<A, B>::value << std::endl;
  std::cout << IsDerived<B, A>::value;
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (04.07.2011, 01:26)


12

04.07.2011, 01:34

Zitat

Deine Typprüfung passiert nämlich zur Compiletime und nicht zur Laufzeit


I know, hatte ich ja oben auch so hingeschrieben(mein letzter Satz) ;)

@Dein Code, gucke ich mir Morgen mal an wenn ich wach bin :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

13

04.07.2011, 01:36

I know, hatte ich ja oben auch so hingeschrieben(mein letzter Satz) ;)

:whistling: schlafengehen ist wohl wirklich keine so schlechte Idee...

babelfish

Alter Hase

  • »babelfish« ist der Autor dieses Themas

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

14

04.07.2011, 10:17

Danke Leute!
Mein Fall ist so: Ich habe verschiedene Einheitetypen die sich von der Klasse "Unit" ableiten. Im Moment habe ich in dieser Klasse einen Enum Wert der beinhält was für ein Einheitentyp das Objekt ist.

Also möchte ich abfragen: Ist diese Einheit ein Krieger? etc. :D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

15

04.07.2011, 13:23

Dann ist es doch einfach ein

C-/C++-Quelltext

1
2
3
Unit* ptr = foo;
if(ptr->type == WARRIOR) static_cast<Warrior*>(ptr)->do1();
else if(ptr->type == SHIP) static_cast<Ship*>(ptr)->do2();

Weil wenn der Typ in der Basisklasse schon bekannt ist, dann kann auch ein static_cast genutzt werden wenn man weiß welcher Typ der Zeiger ursprünglich ist. Oder habe ich das Problem missverstanden?
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.

babelfish

Alter Hase

  • »babelfish« ist der Autor dieses Themas

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

16

04.07.2011, 13:44

Ja, so läuft es im Moment. Ich möchte das ganze aber jetzt machen ohne das enum zu führen.
Wenns nicht geht ist es ok, aber bei C# fand ich diese Abfrage äusserst nützlich daher habe ich mich gefragt obs in C++ auch geht =D

17

04.07.2011, 13:55

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:08)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

04.07.2011, 14:32

Also möchte ich abfragen: Ist diese Einheit ein Krieger? etc. :D

Warum willst du das tun? Wenn du das tun willst heißt das du hast ein Designproblem....

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

19

04.07.2011, 16:33

Ja, so läuft es im Moment. Ich möchte das ganze aber jetzt machen ohne das enum zu führen.


Dann gib der Basisklasse eine Funktion OnXYZ() die dann entsprechend von den abgeleiteteten Klassen implementiert wird.

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

20

04.07.2011, 16:51

Also in meinem Eventsystem muss ich zb auch wissen ob eine Klassen abgeleitet ist, das falls sie abgeleitet ist, ich die Funktionen die auf die Baseklasse warten, auch aufrufen kann.

Das klingt irgendwie sehr merkwürdig, was genau für Funktionen der Basisklasse sind das auf die du da warten musst und warum kannst du das nicht einfach über eine virtuelle Methode lösen?
Das kommt daher, dass man sich Dinge kopiert aber das Design nicht verstanden hat.

Werbeanzeige