(C++) dynamisches casten böse?



  • moin,
    hab grad mal n bissl gestöbert und dabei ist mir aufgefallen wieviele kleinen probleme hier mit dynamic cast gelöst werden.
    nun hab ich noch irgendwie im hinterkopf, das der große meister stroustrup in seiner bibel predigt, das man, wenn man castet ein grundsätzliches design problem hat.
    kann mir das mal jemand näherbringen?
    ist da was dran?
    wie lässt es sich den geschickt umgehen?
    überladen? templates?
    ...???



  • Original erstellt von DBler:
    nun hab ich noch irgendwie im hinterkopf, das der große meister stroustrup in seiner bibel predigt, das man, wenn man castet ein grundsätzliches design problem hat.
    kann mir das mal jemand näherbringen?
    ist da was dran?
    wie lässt es sich den geschickt umgehen?

    casten ist meistens böse. Allerdings gibt es auch hin und wieder situationen wo man casten muss.
    dynamic_cast habe ich aber zB noch nie verwendet und ich nehme an, 80% der Leute die dynamic_cast verwenden, tun dies, weil sie entweder dynamic_cast nicht verstanden haben, oder schwere designprobleme haben.

    umgehen kann man casts in 80% der Fälle durch redesign. static_cast ist IMHO nicht so tragisch, da man es oft braucht wenn man mit einer C API arbeitet (wegen der void*)

    gib mal n beispiel wo du einen dynamic_cast brauchst und wir sagen dir, ob er tatsächlich nötig ist, oder ob es schlechtes design ist.



  • Was ist mit hochcasten von einer Basisklasse auf eine abgeleitete, weil diese spezielle Eigenschaften hat, für die ich keine virtuelle Methode machen möchte? Ist das ein Fall von dynamic cast?



  • Original erstellt von chefe:
    Was ist mit hochcasten von einer Basisklasse auf eine abgeleitete, weil diese spezielle Eigenschaften hat, für die ich keine virtuelle Methode machen möchte? Ist das ein Fall von dynamic cast?

    autsch, das ist schon böse.
    ein cast heisst:
    ich weiss besser als der compiler welchen typ diese variable hat.
    Wenn du jetzt sagst, jedes Auto ist ein Mercedes, dann wird die Methode "getMercedesStern" wohl nicht immer hinhauen.

    Auch logisch gesehen ist es nicht gut zu sagen: jedes Auto ist ein Mercedes.
    Ausnahme: du weisst, dass dieses Auto ein Mercedes ist - bessere Lösung: Polymorphie.

    gib mal n Beispiel



  • angenommen ich habe eine ereignisbehandlung die für verschiedene klassen taugt, dann frag ich die klasse des senders ab und caste ihn entsprechend bevor ich die eigentlichen methoden aufrufe,
    oder allgemeiner: sender casten in ereignis?



  • ich verschieb das mal nach C++

    Also dynamic_cast habe ich bisher nur einmal gebraucht, da ging es darum, dass ich einen streambuffer geschrieben hatte und damit den streambuffer eines normalen streams ersetzt hatte, da ich nun auch die spezial Eigenschaften dieses Buffers nutzen wollte über spezielle Manipulatoren, hab ich folgendes gemacht

    template<class charT, class traits=std::char_traits<charT> >
    class mystreambuf : std::basic_streambuf<charT,traits>
    {
    //...
    public:
      int spezialfunktion(void);
    };
    
    struct manipulator
    {
      //...
    };
    
    manipulator spezfunktion;
    
    std::ostream &operator<<(std::ostream &out, const manipulator &obj)
    {
      mystreambuf *ptr=dynamic_cast<mystreambuf>(out.rdbuf());
      if(ptr)
        ptr->spezialfunktion();
      return out;
    }
    
    int main()
    {
      mystreambuf mybuf;
      std::cout.rdbuf(&mybuf);
      std::cout << spezfunktion << "Hallo Welt" << std::endl;
    }
    

    Gibt es da einen besseren Weg? Ich habe keinen gefunden.

    Ich denke, dass dynamic_cast auch noch einer der sicheren Casts ist, mit const_cast und reinterpret_cast oder C Casts kann man viel schlimmere Dinge tun


Anmelden zum Antworten