Dynamische Typumwandlung



  • jo, danke schonmal, ein total bescheuerter fehler.. aber mit der "abnormal program termination" hatte das leider nichts zu tun, da durch den fehler einfach nur jedesmal "Keine Katze" angezeigt werden würde.. habs korrigiert und läuft immernoch nicht...
    das Buch heißt "jetzt lerne ich C++" (Jesse Liberty) von Markt+Technik



  • Kann eigentlich nicht sein, ich habe GENAU den Code, den leech gepostet hat mit Dev-Cpp (Ja ich weißl, dass das kein Compiler ist, aber das ist hier egal) kompiliert und das Programm läuft einwandfrei.

    Muss also eigentlich an deinem Compiler liegen. Wenn man Referenzen mit dynamic_cast umcastet und das nicht funktioniert, wird eine Exception geworfen. Probier doch mal den Code aus:

    #include <iostream>
    using namespace std;
    
    class Mammal
    {
    public:
    Mammal():itsAge(1) { cout << "Mammal Konstruktor...\n"; }
    ~Mammal() { cout << "Mammal Destruktor...\n"; }
    virtual void Speak() const { cout << "Mammal gib Laut!\n"; }
    protected:
    int itsAge;
    };
    class Cat : public Mammal
    {
    public:
    Cat() { cout << "Cat Konstruktor...\n"; }
    ~Cat() { cout << "Cat Destruktor...\n"; }
    void Speak() const { cout << "Miau!\n"; }
    void Purr() const { cout << "rrrrrrrrr\n"; }
    };
    
    class Dog : public Mammal
    {
    public:
    Dog() { cout << "Dog Konstruktor...\n"; }
    ~Dog() { cout << "Dog Destruktor...\n"; }
    void Speak() const { cout << "Wuff!\n"; }
    };
    
    int main()
    {
    const int NumberMammals = 3;
    Mammal *Zoo[NumberMammals];
    Mammal *pMammal;
    int choice;
    for (int i=0; i<NumberMammals; i++)  //kann in die schleife
    {
    cout << "(1)Hund (2)Katze: ";
    cin >> choice;
    if (choice == 1)      //ein fehler... besser wäre ein switch.. was ist, wenn er was anderes eingibt?
    { pMammal = new Dog; }  //warum machst du es auf einem umweg?
    else
    { pMammal = new Cat; }     //schreib doch sofort Zoo[i]
    
    Zoo[i] = pMammal;         //benötigst du dann gar nicht mehr....
    }
    
    cout << endl;
    
    for (int i=0; i<NumberMammals; i++)  //siehe oben
    {
    Zoo[i]->Speak();
    
    Cat *pRealCat = 0;
    try
    {
        pRealCat = dynamic_cast< Cat *> (Zoo[i]);
    }
    catch(bad_cast)
    {
        cout << "Aha das war das Problem!" << endl;
    }
    
    if (pRealCat)      
    { pRealCat->Purr(); }
    else
    { cout << "Keine Katze"; }
    
    delete Zoo[i];
    cout << endl;
    }
    cin.get();
    cin.get();
    
    return 0;
    }
    

    Wenn jetzt "Aha, das war das Problem" ausgegeben wird, weisst du, was das Problem war. Wenn nicht, muss es an irgendetwas anderem liegen 🤡

    MfG

    Felix

    P.S: Ach ja das Buch habe ich auch, hab mich nicht mehr so genau erinnert, in welchem Buch das so stand.



  • hm, er gibt im Vergleich zu den vorherigen Codes einmal "Miau" bzw "Wuff" aus, dann kommt der gleiche fehler... wenn ich meinen ursprünglichen code kompiliere erscheint folgende warnung:

    dynamische typumwandlung4.cpp(54) : warning C4541: 'dynamic_cast' used on polymorphic type 'class Mammal' with /GR-; unpredictable behavior may result



  • *ais verzweifelung noch ein letztes mal nach oben schieb*



  • DarkSea schrieb:

    dynamische typumwandlung4.cpp(54) : warning C4541: 'dynamic_cast' used on polymorphic type 'class Mammal' with /GR-; unpredictable behavior may result

    du musst /GR+ oder /GR oder so in den compilereinstellungen anmachen, dann sind die results predictable.
    ist /GR nicht ein anderer namen für den knopf "enable rtti" ?



  • volkard schrieb:

    DarkSea schrieb:

    dynamische typumwandlung4.cpp(54) : warning C4541: 'dynamic_cast' used on polymorphic type 'class Mammal' with /GR-; unpredictable behavior may result

    du musst /GR+ oder /GR oder so in den compilereinstellungen anmachen, dann sind die results predictable.
    ist /GR nicht ein anderer namen für den knopf "enable rtti" ?

    *dickes Fragezeichen*

    naja, wenn ich mal wieder Zeit hab werd ich mich neben der Programmiersprache auch mal etwas mit den Compilern beschäftigen... bis jetzt hat mit MS Visual C++ 6 immer alles gut funktioniert, mal schaun...



  • DarkSea schrieb:

    naja, wenn ich mal wieder Zeit hab werd ich mich neben der Programmiersprache auch mal etwas mit den Compilern beschäftigen... bis jetzt hat mit MS Visual C++ 6 immer alles gut funktioniert, mal schaun...

    drück einfach mal Alt+F7 und schau schnell durch, ob dir ein "enable RTTI" ins auge fällt. wenn ja, dann klicke das kästchen an und schau, ob es die warnung weggemacht hat.



  • volkard schrieb:

    DarkSea schrieb:

    naja, wenn ich mal wieder Zeit hab werd ich mich neben der Programmiersprache auch mal etwas mit den Compilern beschäftigen... bis jetzt hat mit MS Visual C++ 6 immer alles gut funktioniert, mal schaun...

    drück einfach mal Alt+F7 und schau schnell durch, ob dir ein "enable RTTI" ins auge fällt. wenn ja, dann klicke das kästchen an und schau, ob es die warnung weggemacht hat.

    hm, wenn ich alt+F7 drück passiert nichts (außer ein "dong" sound).
    wo könnte man das sonst in den Einstellungen finden ? bin bis jetzt nicht drauf gestoßen...



  • volkard schrieb:

    DarkSea schrieb:

    naja, wenn ich mal wieder Zeit hab werd ich mich neben der Programmiersprache auch mal etwas mit den Compilern beschäftigen... bis jetzt hat mit MS Visual C++ 6 immer alles gut funktioniert, mal schaun...

    drück einfach mal Alt+F7 und schau schnell durch, ob dir ein "enable RTTI" ins auge fällt. wenn ja, dann klicke das kästchen an und schau, ob es die warnung weggemacht hat.

    hm, wenn ich alt+F7 drück passiert nichts (außer ein "dong" sound).
    wo könnte man das sonst in den Einstellungen finden ? bin bis jetzt nicht drauf gestoßen...



  • Also ich wuerde auf jeden Fall einen anderen Compiler nehmen. Ich finde den Ms Visual C++ nicht gerade gut. Der nimmt es mit dem Standard nich so genau und ist auch ziemlich veraltet. Ich selbst benutze Dev-Cpp mit dem integrierten Compiler:

    http://www.bloodshed.net/devcpp.html

    MfG

    Felix



  • Phoemuex schrieb:

    Also ich wuerde auf jeden Fall einen anderen Compiler nehmen. Ich finde den Ms Visual C++ nicht gerade gut. Der nimmt es mit dem Standard nich so genau und ist auch ziemlich veraltet. Ich selbst benutze Dev-Cpp mit dem integrierten Compiler:

    http://www.bloodshed.net/devcpp.html

    MfG

    Felix

    die 4er oder die 5er version ? werd ich mir gleich mal runterladen, ich hab bis jetzt nur MS benutzt weil mir gcc und ähnliche irgendwie zu umständlich waren und ich als anfänger mich erstmal mehr mit der Sprache selbst beschäftigen wollte als mit dem compiler..



  • Ich benutze die 5er Beta (4.9.9.1). Aber aufpassen du musst die nehmen, bei der der Compiler mit dabei ist sonst hast du nur die IDE (Das Programm, in das du den Quelltext eingibst...). Das einzig unschöne finde ich die Smart-Tabs. Die kann man aber ganz einfach unter

    Tools ➡ EditorOptions ➡ SmartTabs ausstellen.

    MfG

    Felix


Anmelden zum Antworten