(Derived)Base Problem



  • Hi, ich habe mal wieder ein blödes Problem. Und zwar habe ich verschiedene Datentypenklassen wie Double, Int, String usw. die alle von einer gemeinsamen Basisklasse Object abgeleitet sind.

    Wenn ich jetzt folgenden Aufruf machen will kommt der Fehler dass die Basis (Object) nicht in die abgeleitete Klasse Double umgewandelt werden kann.

    Double d = Value(L"Width");
    

    Klar, denn die Funktion Value() gibt die Variable

    Object value;
    

    zurück. Allerdings wurde diese mit folgendem Aufruf

    RegisterProperty(L"Width", L"Double", (Double)0.0);
    

    als Double initialisiert. Und trotzdem geht es nicht.
    Gibt es eine Lösung für diese verzwickte Situation?



  • Downcast? Allerdings solltest du dir überlegen, ob es nicht eine Möglichkeit gibt, die Typsicherheit zu bewahren.



  • Das scheint zu gehen. Allerdings kann man diesen langen Ausdruck ja niemandem zumuten. Kann man so einen dynamic_cast verwenden oder ist das schlechter Stil?

    Double d = dynamic_cast<Double&>(Value(L"Width"))
    

    Ich habe den Code jetzt mal um ein Template ergänzt. So dass ich

    Double d = Value<Double>(L"Width");
    

    schreiben kann. Beim Comilieren bekomme ich jetz allerdings mehrere dieser Fehler:

    error C2664: 'Double::Double(double)' : cannot convert parameter 1 from 'Object' to 'double'
    

    Ich nehme mal an das ist das selbe Problem. Der Compiler findet keinen Konstruktor der ein Object in einen Double konvertiert.

    Ich könnte gleich anfangen zu weinen ;). Man kann also eine std::map<string, Object> anlegen und diese munter mit Variablen, die von Object abgeleitet sind füllen, aber nicht mehr ohne casting auslesen.
    Mir scheint C++ hat seine guten Tage schon lange hinter sich. Ich habe wirklich nicht viele Ansprüche. Und trotzdem hangele ich mich nur noch von Problem zu Problem. Das kann doch nicht wahr sein.



  • In deinem Fall sollte, solange du nicht virtuell erbst,
    auch ein static_cast reichen...

    Gruß,
    XSpille



  • Student83 schrieb:

    Man kann also eine std::map<string, Object> anlegen und diese munter mit Variablen, die von Object abgeleitet sind füllen, aber nicht mehr ohne casting auslesen.

    Natürlich. Indem du die Abstraktion Object verwendest, drückst du aus, dass du an den Gemeinsamkeiten der einzelnen Typen interessiert bist. Die spezifischen Eigenschaften kannst entweder mit virtuellen Funktionen schön wegkapseln – oder du nimmst halt in Kauf, dass es sich beim Auslesen um den falschen Typ handelt.

    Vielleicht bringen dir auch Design Patterns wie Visitor etwas. Grundsätzlich sieht ein Value<Double>() gar nicht so schlecht aus. Du musst halt den Cast intern vornehmen und im Fehlerfall Exceptions werfen oder so.

    Student83 schrieb:

    Mir scheint C++ hat seine guten Tage schon lange hinter sich. [...] Das kann doch nicht wahr sein.

    Das ist weniger ein Problem von C++, als ein prinzipielles. Auf ein Objekt, das zur Laufzeit jeden Typ annehmen kann, kannst du nicht typsicher zur Kompilierzeit zugreifen – weil du den Typ nicht kennst. Du kannst ihn gar nicht kennen, weil er erst zur Laufzeit bekannt ist. Das ist in anderen Sprachen nicht anders. Schau doch nur mal Java an, vor der Einführung der Generics war dieses dauernde Gecaste bei Collections sogar die Standardvorgehensweise.



  • Student83 schrieb:

    Mir scheint C++ hat seine guten Tage schon lange hinter sich. Ich habe wirklich nicht viele Ansprüche. Und trotzdem hangele ich mich nur noch von Problem zu Problem. Das kann doch nicht wahr sein.

    Das liegt nicht an C++ sondern an Dir. Du versuchst scheinbar krampfhaft C++ wie eine Sprache zu behandeln, welche nichts mit C++ zu tun hat. Dabei kommt der gleiche Mist raus, wie bei einer Wort-für-Wort Übersetzung einer Videorekorderanleitung von chinesisch auf deutsch. du musst als erstes verstehen, dass der Unterschied zwischen den Sprachen, die Du bereits kennst, und C++ viel größer ist, als Du es wahrhaben willst. Dein Vorwissen ist also eher ein Hinderniss als von Vorteil. Daher solltest Du Dir auch mindestens eins der empfohlenen C++ Bücher besorgen und C++ richtig lernen statt Dir Dinge über C++ falsch zusammen zu reimen. Wie Du siehst, fährst Du mit Deienr bisherigen "Lernstrategie" ständig gegen die Wand.


Anmelden zum Antworten