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

babelfish

Alter Hase

  • »babelfish« ist der Autor dieses Themas

Beiträge: 1 222

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

1

03.07.2011, 22:48

Is Operator in C++

In C# gibt es den Operator "IS", der überprüft ob ein Objekt einer Klasse abgeleitet wurde.
Siehe: http://msdn.microsoft.com/en-us/library/…w(v=vs.71).aspx

Gibt es etwas ähnliches in C++?
Ich habe zwar typeid() gefunden, bin aber kein grosser Fan von Stringvergleichen :whistling:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

03.07.2011, 22:50

Du kannst zwei type_info Objekte direkt vergleichen. Allerdings sollte dir allein schon die Tatsache dass du den Laufzeittyp eines Objektes herausfinden willst zu denken geben. Denn normalerweise ist das Symptom eines Designfehlers. Wofür genau meinst du denn das zu brauchen?

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

03.07.2011, 23:10

Du kannst eine dynamic_cast<..>(...) durchführen. Wenn der zurückgegebene Pointer nicht NULL ist, wurde dein Objekt von der angegeben Klasse abgeleitet oder ist sie sogar.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

03.07.2011, 23:16

Auch eine Möglichkeit, typeid wäre aber potentiell effizienter als dynamic_cast. Und beides behandelt wie gesagt nur die Symptome des Designproblems, löst aber nicht das Problem an sich.

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

03.07.2011, 23:29

Ich habe typeid mal verwendet, als ich einen Exceptionhandler für eine Klasse für Dateioperationen mit Templates geschrieben habe, damit ich Fehlermeldungen wie "Fehler beim Schreiben von "MyStruct"" erzeugen konnte. In der VCL-Library wird oft ein TObject Objekt bei Event-Handlern als Parameter übergeben, damit man Informationen über das Steuerelement erhalten kann, das das Event ausgelöst hat. Hier kann man die Eigenschaft ClassName oder typeid verwenden, um den Typ des Steuerelements herauszufinden. Aber andere Fälle, wo man das braucht, kann ich mir nicht vorstellen.

6

03.07.2011, 23:44

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. Ich habe dafür aber noch Defines die in dem Fall, falls abgeleitet ist ein "typedef EventBaseClass" erstellen.

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
template<typename Class, typename BaseClass> 
class HasEventBaseClassTemplateClass 
{
public:
    //! Gibt zurück ob es eine Basis-Klasse gibt, also von der abgeleitet wurde
    static bool HasBaseClass() 
    { 
        // True, da es zwei veschiedene Template Parameter gibt
        return true; 
    }
};

template<typename Class> 
class HasEventBaseClassTemplateClass<Class, Class> 
{
public:
    //! Gibt zurück ob es eine Basis-Klasse gibt, also von der abgeleitet wurde
    static bool HasBaseClass() 
    { 
        // False, da es es nur einen Template Parameter gibt und so der zweite auch gleich ist
        return false; 
    }
};

//! Gibt zurück ob ein Event abgeleitet ist und so eine Basisklasse hat
template<typename Event>
bool HasEventBaseClass()
{
    return HasEventBaseClassTemplateClass<Event, Event::EventBaseClass>::HasBaseClass();
}


Jetzt braucht man dann nur noch

C-/C++-Quelltext

1
if(HasEventBaseClass<Event>())

aufrufen und schon wird zur Compilezeit geprüft ob abgeleitet ist. Da ja entweder true/false rauskommt, dürfte das der Compiler auch gleich wegoptimieren und es bleiben nur die Instruktionen vom if.

Ich hoffe das hilft ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

03.07.2011, 23: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?

8

03.07.2011, 23:54

Nein wenn ich zb die Klasse InputEvent habe und davon leitet die Klasse MouseEvent ab.
Ich schicke jetzt ein Event vom Type MouseEvent. Aber es gibt jetzt jemanden der alle InputEvents haben möchte.
Also muss ich ja das MouseEvent an alle Eventlistener schicken und dann alle EventListener vom InputEvent aufrufen.
Ich hoffe das ist verständlich ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

04.07.2011, 00:02

Warum muss das MouseEvent denn unbedingt von InputEvent abgeleitet sein, was genau gewinnst du dadurch?

10

04.07.2011, 00:17

Muss es ja nicht, das war nur ein Beispiel.
Aber naja was könnte man gewinnen? Zum Beispiel steht auf dem Bildschirm "drücke irgendeine Taste", da könnte man das verwenden.
Wie gesagt, über die Sinnhaftigkeit kann man sich gerne streiten, ist einfach nur ein Beispiel ;)

Werbeanzeige