Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   C++ is Operator bzw. RTTI (https://www.delphipraxis.net/178904-operator-bzw-rtti.html)

MrSpock 3. Feb 2014 07:17

is Operator bzw. RTTI
 
Hallo,

was ist das C++ Gegenstück zum Pascal IS Operator oder anders gefragt, wie kann ich in C++ die Run Time Type Information (RTTI) abrufen?

Furtbichler 3. Feb 2014 07:35

AW: is Operator bzw. RTTI
 
Stackoverflow hilft dir nicht weiter?
Code:
NewType* myObjectAsNewType = dynamic_cast<NewType*>(&myObject); // 'as' a la C++
if (myObjectAsNewType)
{
    // do something with myObjectAsNewType
}
Also: erst sicher umformen, dann prüfen, ob es geklappt hat und dann weitermachen. Delphi knallt beim 'As' Operator. Andere Programmiersprachen liefern nil/null/0 zurück.

Aber zu deiner Frage: Der 'is' Operator dürfte so umzusetzen sein,
Code:
if (dynamic_cast<NewType*>(myObject) != NULL) // <<--- hier war vorher ein blöder Fehler. Danke DeddyH
{
  // now you can safely cast myObject
}

DeddyH 3. Feb 2014 07:38

AW: is Operator bzw. RTTI
 
Öhm, müsste es nicht genau anders herum sein (!= NULL)? Allerdings gebe ich gern zu, dass meine C++-Kenntnisse nahe gegen 0 tendieren.

BUG 3. Feb 2014 07:57

AW: is Operator bzw. RTTI
 
Wichtig zu wissen: Der dynamische Cast klappt nur, wenn es in der Klasse mindestens eine virtuelle Methode gibt; nur dann gibt es zur Laufzeit die nötigen Informationen. In der Regel möchte man in solchen Fällen eh den Dekonstructor virtuell machen.

EDIT: @DeddyH Jup.

Allerdings ist es oft Blödsinn, das Ergebnis des Casts wegzuwerfen. Casten kostet manchmal, insbesondere wenn Mehrfachvererbung (zB. durch "Interfaces") in Spiel kommt. Außerdem wird der Code durch mehrfaches Casten nicht gerade lesbarer.

MrSpock 3. Feb 2014 12:23

AW: is Operator bzw. RTTI
 
Danke. Furtbichlers Code hat funktioniert, wobei DeddyH recht hat, dass im Falle, dass NULL zurückkommt, der dynamic cast gerade nicht erfolgreich war.

Furtbichler 3. Feb 2014 15:34

AW: is Operator bzw. RTTI
 
Zitat:

Zitat von MrSpock (Beitrag 1246501)
Danke. Furtbichlers Code hat funktioniert, wobei DeddyH recht hat, dass im Falle, dass NULL zurückkommt, der dynamic cast gerade nicht erfolgreich war.

Na ja. Diese Kleinigkeiten. :oops: Ich korrigiere...

Aphton 3. Feb 2014 18:24

AW: is Operator bzw. RTTI
 
Spreche nicht wirklich C++ aber was ist mit typid() (runterscrollen)?

BUG 3. Feb 2014 22:37

AW: is Operator bzw. RTTI
 
Zitat:

Zitat von Aphton (Beitrag 1246533)
Spreche nicht wirklich C++ aber was ist mit typid() (runterscrollen)?

typeid ist dafür nicht wirklich hilfreich:
Zitat:

When typeid is applied to an expression whose type is a polymorphic class, the result is the type of the most derived complete object
Das könnte leicht Probleme geben, wenn die überprüfende Klasse nicht ganz unten in der Vererbungshierachie steht. Es anscheinend gibt keine Möglichkeit, Vererbungsbeziehungen über typeid zu ermitteln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz