Anfängerfrage (const | virtual)



  • Habe 2 Probleme:

    Mit virtual erstelle ich ja wie in java eine abstrakte Methode die überschrieben werden muss. Das hab ich getan, doch er meckert nun das es keinen virtual Destrictor gibt wieso sollt ich einen erzeugen?

    Die zweite frage wäre wann hänge ich an eine funktion const an hab das nicht ganz kapiert.

    Danke für die HIlfe.



  • Stamu schrieb:

    Die zweite frage wäre wann hänge ich an eine funktion const an hab das nicht ganz kapiert.

    Wenn deine Methode nichts an der Klasse ändert, also z.B. bei gettern. Google: c++ const correctness



  • zu virtual: als faustregel kannst du dir merken, dass wenn du eine elementfunktion als virtual gekennzeichnet hast, musst du auch deinen destructor virtual machen, einfach damit alle erzeugten objekte korrekt wieder zerstört werden.

    zu const elementfunktionen: solche funktionen verändern den zustand eines objektes nicht, sprich sie ändern den wert der daten nicht. z.b. bei get-funktionen, die nur einen wert wiedergeben, ihn aber nicht verändern.

    class x
    {
       int a;
    
    public:
        int getA() const {return a;}
    };
    

    ps.: das erfährst du in jedem halbwegs guten anfängerbuch 😉



  • ausnahme sind mutable vaiablen

    mutable int a;
    

    die kann man auch in eienr const funktion ändern...



  • Danke für die Hilfe



  • HAbe noch ein kleines Problem glaube liegt am virtual.
    Struktur des Programms:

    class A
    {
    public:
    virtual double foo() const;
    private:
    char temp;
    };
    
    class B : public A
    {
    private:
    A neuesA;
    };
    
    class C : public B
    {
    public:
    B(char a)
    {
    temp = a;
    };
    double foo() const;
    }
    };
    
    so wenn ich nun in der cpp folgendes machen will:
    
    double C::foo() const
    {
    return B::neuesA.foo();
    }
    

    sagt er mir das es foo nicht gebe für neuesA, aber ich vererbe es ja an alle klassen und es muss ja überschrieben werden also hat ja eigentlich jeder ein foo oder nicht?



  • hat jemand eine idee?



  • Stamu schrieb:

    hat jemand eine idee?

    Nach 2 Stunden schon ungeduldig? Geduld ist eine tugend, und die Hilfe der Leute hier freiwillig UND Kostenlos.

    Aber damit du nicht dumm stirbst: neuesA ist private, da kommt ne abgeleitete Klasse nicht dran.



  • das mit dem private war Tippfehler von mir soll protected sein

    Zu dem keine Geduld und dem Rest:
    Es ist jedem klar das hier die Leute freiwillig UND Kostenlos helfen, dafür sind auch alle dankbar. Deine Antwort auf die Frage (... nicht dumm stirbst ...) ist naja lassen wir das.



  • Stamu schrieb:

    das mit dem private war Tippfehler von mir soll protected sein

    dann würde ich an deiner Stelle nochmal den Code ohne tippfehler posten, denn ich seh da noch ein paar andere "Tippfehler".



  • Danke für den hinweis hier der code sollte nun stimmen

    class A
    {
    public:
    virtual double foo() const;
    protected:
    char temp;
    };
    
    class B : public A
    {
    protected:
    A neuesA;
    };
    
    class C : public B
    {
    public:
    B(char a)
    {
    temp = a;
    };
    double foo() const;
    };
    

    so wenn ich nun in der cpp folgendes machen will:

    double C::foo() const
    {
    return B::neuesA.foo();
    }
    

    sagt er mir das es foo nicht gebe für neuesA, aber ich vererbe es ja an alle klassen und es muss ja überschrieben werden also hat ja eigentlich jeder ein foo oder nicht?



  • Stamu schrieb:

    sagt er mir das es foo nicht gebe für neuesA, aber ich vererbe es ja an alle klassen und es muss ja überschrieben werden also hat ja eigentlich jeder ein foo oder nicht?

    Wie lautet die Fehlermeldung denn genau? Irgendwas in Richtung "unresolved external symbol"?

    Ich seh einfach nur, dass A keine implementation von foo() hat. Bei virtuellen funktionen brauchst du immernoch einen Funktionsrumpf.



  • undefined reference to `A::foo() const' ist die Meldung

    Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?



  • Du willst eine Methode aufrufen die es nicht gibt, wie soll das gehen?



  • Stamu schrieb:

    Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?

    Jap. pure virtual(=0) weist den compiler explizit darauf hin, dass die Funktion keinen Körper hat.

    Nebenbei ist es für neuesA egal, ob die abgeleiteten Klassen überschrieben sind. Denn neuesA hat den dynamischen typ A, es ist ein echtes Objekt der Basisklasse, keine abgeleitete Klasse. (ich wette, dass du vergessen hast dass C++ Im gegensatz zu Java nicht alle Objekte als referenz speichert, sondern dass C++ einen Unterschied zwischen Objekt, Referenz und Zeiger macht)


  • Mod

    otze schrieb:

    Stamu schrieb:

    Bin davon ausgegangen das er ja sieht das die foo Funktion in jeder Unterklasse überschrieben wird. Würde es was bringen wenn ich die ganze Klasse sozusagen abstract mache mit = 0?

    Jap. pure virtual(=0) weist den compiler explizit darauf hin, dass die Funktion keinen Körper hat.

    Nicht ganz. Eine virtuelle Funktion, die nicht rein virtuell ist, muss definiert werden, eine rein virtuelle Funktion kann definiert werden. Wäre foo in A eine rein virtuelle FUnktion, so wäre A abstrakt und die Definition als Member von B nicht möglich.



  • Danke für die Tipps hat nun geklappt.


Anmelden zum Antworten