OT: Nickdiskussion
-
Swordfish schrieb:
Wie's
typeid
macht ist IMHO nicht Standardisiert -> Jeder Compiler darf sein eigenes Süppchen kochen...ich hab's grad' mal ausprobiert:
class A {}; class B : public A {}; int main () { B *b = new B; if (typeid(B) == typeid(*b)) cout << "b is a B" << endl; if (typeid(A) == typeid(*b)) cout << "b is also an A" << endl; }
scheint zu klappen.
aber wenn es so ist wie du sagst, könnte es dann auch compiler geben, die den zweiten vergleich durchlassen?
-
Du tust jedenfalls nicht das gleiche wie dynamic_cast.
Nimm Klasse A, erbe davon Klasse B und davon nochmal Klasse C. Wenn Du jetzt einen A-Pointer auf ein C-Objekt hast, dann macht dynamic_cast dir auch nen schönen cast auf B. Aber die Variante mit typeid schlägt fehl.
-
Jester schrieb:
Du tust jedenfalls nicht das gleiche wie dynamic_cast.
Nimm Klasse A, erbe davon Klasse B und davon nochmal Klasse C. Wenn Du jetzt einen A-Pointer auf ein C-Objekt hast, dann macht dynamic_cast dir auch nen schönen cast auf B. Aber die Variante mit typeid schlägt fehl.richtig, aber dafür müsste 'typeid' geschwindiglkeitsmässig eine rakete sein, im vergleich zu 'dynamic_cast'.
wenn man ein objekt wieder in seinen ausgangstyp zurückcasten will, dann müsste ein check mit 'typeid' und danach ein einfacher cast doch optimal sein, weil eben nicht die gesamte vererbungsstruktur durchsucht wird.
-
Undertaker schrieb:
richtig, aber dafür müsste 'typeid' geschwindiglkeitsmässig eine rakete sein, im vergleich zu 'dynamic_cast'.
wenn man ein objekt wieder in seinen ausgangstyp zurückcasten will, dann müsste ein check mit 'typeid' und danach ein einfacher cast doch optimal sein, weil eben nicht die gesamte vererbungsstruktur durchsucht wird.
Für "Fehlerfälle" - ja. Aber wenn du sowieso den richtigen Typen verwendest, musst dynamic_cast ja auch nicht die komplette Hierachie durchlaufen sondern matcht sofort den ersten Typen.
Ein Fehlerfall ist dann natürlich schneller - aber er macht ja auch etwas komplett anderes. Äpfel und Birnen, du weißt.
-
Ich könnte mich ja irren, aber sind C++-Diskussionen in Neuigkeiten nicht eigentlich OT???
-
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren, irrst Du bestimmt.
greetz, Swordfish
-
Marc++us schrieb:
Ich könnte mich ja irren, aber sind C++-Diskussionen in Neuigkeiten nicht eigentlich OT???
im c++ forum gelten solche diskussionen als pure blasphemie. dann kommt der CStoll daher und schmeisst mich wieder raus...
Swordfish schrieb:
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren...
oh, sind Artchi und Mr.N gerade zu moderatoren ernannt worden?
-
Undertaker schrieb:
Swordfish schrieb:
Da 6 (in Worten: Sechs) Moderatoren mitdiskuttieren...
oh, sind Artchi und Mr.N gerade zu moderatoren ernannt worden?
Nö, hab' mich aber verzählt: 7 (CStoll, nman, Tim, estartu, SideWinder, Jester, Shade Of Mine)
greetz, Swordfish
PS: Kann jetzt bitte einer dieses Rumgetrolle beenden!?
-
Swordfish schrieb:
PS: Kann jetzt bitte einer dieses Rumgetrolle beenden!?
Wieso? Stört doch keinen solange alles in diesem Thread bleibt und ich finds lustig.
-
Ben04 schrieb:
Swordfish schrieb:
PS: Kann jetzt bitte einer dieses Rumgetrolle beenden!?
Wieso? Stört doch keinen solange alles in diesem Thread bleibt und finds lustig.
Da schliesse ich mich an. Und ich habe sogar einen Vorschlag für Undertaker oder wie auch immer er nun genannt werden will. Falls du dann wieder einen neuen Nick brauchst, wie wäre es mit Hofnarr?
Grüssli
-
Dravere schrieb:
Da schliesse ich mich an. Und ich habe sogar einen Vorschlag für Undertaker oder wie auch immer er nun genannt werden will. Falls du dann wieder einen neuen Nick brauchst, wie wäre es mit Hofnarr?
Dem schließe ich mich an.
-
@Undertaker: Du kannst natürlich gerne einen eigenen direct_cast<> erstellen, der mit den typeid's arbeitet. Aber damit wirst du doch sehr unflexibel. Und im Endeffekt läuft das Problem doch wieder darauf hinaus, den Compiler an irgendwelche Typinformationen zu erinnern, die du vorher über Bord geworfen hast (und egal, welchen Cast du verwendest - sowas deutet fast immer auf fehlerhaftes Design).
PS: Und den Namen "Hofnarr" können wir gerne für dich reservieren
-
Wären es nicht lediglich zwei kleine SQL-Befehle, einen vorher reservierten Namen jedes Mal seiner momentanen Inkarnation zuzuweisen? :p
-
árn[y]ék schrieb:
Wären es nicht lediglich zwei kleine SQL-Befehle, einen vorher reservierten Namen jedes Mal seiner momentanen Inkarnation zuzuweisen? :p
Technisch wäre das kein Problem. Aber die Angemessenheit solcher Schritte hat wohl nicht unbedingt etwas damit zu tun, wie sehr mir jemand auf die Nerven geht.
-
Deshalb ja auch der Smiley
-
Hofnarr ist schon prima, aber nicht als User-Nick, sondern als Benutzerklasse. Wenn Marc++us sich die Mühe machen will.
-
CStoll schrieb:
@Undertaker: Du kannst natürlich gerne einen eigenen direct_cast<> erstellen, der mit den typeid's arbeitet. Aber damit wirst du doch sehr unflexibel.
es muss ja nicht flexibel sein, sondern nur den originaltyp zurückholen.
ich würde ihn 'dream_cast<>' taufenCStoll schrieb:
Und im Endeffekt läuft das Problem doch wieder darauf hinaus, den Compiler an irgendwelche Typinformationen zu erinnern, die du vorher über Bord geworfen hast
wenn sie wirklich weggeworfen wurden, dann könnte man sie ja nicht wieder hervor kramen. also wirklich weg sind sie nicht, mir scheint nur C++ hat leichte probleme, damit vernünftig umzugehen.
CStoll schrieb:
(und egal, welchen Cast du verwendest - sowas deutet fast immer auf fehlerhaftes Design).
das gilt für C++ wegen: 'siehe oben'
Joe_M. schrieb:
Hofnarr ist schon prima, aber nicht als User-Nick, sondern als Benutzerklasse.
und was ist mit neuanmeldungen? startet man dann gleich mit 'hofnarr'?
-
Undertaker schrieb:
CStoll schrieb:
@Undertaker: Du kannst natürlich gerne einen eigenen direct_cast<> erstellen, der mit den typeid's arbeitet. Aber damit wirst du doch sehr unflexibel.
es muss ja nicht flexibel sein, sondern nur den originaltyp zurückholen.
CStoll schrieb:
Und im Endeffekt läuft das Problem doch wieder darauf hinaus, den Compiler an irgendwelche Typinformationen zu erinnern, die du vorher über Bord geworfen hast
wenn sie wirklich weggeworfen wurden, dann könnte man sie ja nicht wieder hervor kramen. also wirklich weg sind sie nicht, mir scheint nur C++ hat leichte probleme, damit vernünftig umzugehen.
Der Compiler vertraut aber nunmal nicht auf diese dynamischen Informationen (das würde seine Arbeit nur unnötig erschweren, weil er beim Compilieren noch nicht wissen kann, welche Methoden die Objekte tatsächlich haben werden), sondern nur auf den statischen Typ. (und afaik mußt du in Java genauso casten, wenn du eine Object-Referenz bekommst, von der du weißt, was für eine Klasse sich wirklich dahinter verbirgt
Ein besseres Design ist es deshalb, wenn (a) entweder es nicht nötig ist, überhaupt zu casten (weil alle notwendigen Zugriffe im Basis-Interface bereits vorgesehen sind) oder (b) die Objekte so abgelegt werden, daß der Compiler auch den richtigen Typ mitverfolgen kann (in Boris' Beispiel hätte ich statt einer list<Basis*>, die abwechselnd A- und B-Objekte enthält, lieber eine list<pair<A*,B*>> verwendet).
CStoll schrieb:
(und egal, welchen Cast du verwendest - sowas deutet fast immer auf fehlerhaftes Design).
das gilt für C++ wegen: 'siehe oben'
Das gilt für jede halbwegs typsichere Sprache - Casts sollten vermieden werden, wenn sie nicht unbedingt erforderlich sind.
Joe_M. schrieb:
Hofnarr ist schon prima, aber nicht als User-Nick, sondern als Benutzerklasse.
und was ist mit neuanmeldungen? startet man dann gleich mit 'hofnarr'?
Nein, den werden wir extra für dich und deine Reinkarnationen reservieren
-
Ne sobald man dich wieder erkannt hat kriegst du den Title verliehen. Sag mal mit welchem Nick bist du eigentlich unterwegs wenn du willst, dass man dich ernst nimmt?
-
Ben04 schrieb:
Sag mal mit welchem Nick bist du eigentlich unterwegs wenn du willst, dass man dich ernst nimmt?
mit keinem. wie schon weiter oben zig-mal erklärt wurde, benutze ich nie mehrere nicks parallel (hey, wir sind wieder beim topic).