[gelöst] Erster Kontakt mit Klassen



  • Hallo!
    Mein erster Kontakt mit Klassen macht mich traurig:

    //Ort.h
    #ifndef ORT_H_INCLUDED
    #define ORT_H_INCLUDED
    
    class Ort   {
    
        public:
            int getX() const;
            int getY() const;
            void aendern(int x, int y);
            void ausgabe() const;
            Ort();                      //Eigener Standardkonstruktor
    
        private:
            int xKoord,
                yKoord;
    };
    
    #endif // ORT_H_INCLUDED
    
    //Ort.cpp
    #include <iostream>
    #include "Ort.h"
    
    int Ort::getX() const   {return xKoord;}
    int Ort::getY() const   {return yKoord;}
    
    void Ort::aendern(int x, int y) {
        xKoord = x;
        yKoord = y;
    
        std::cout << "Ort-Objekt geaendert! x = " << xKoord << ", y = " << yKoord << std::endl;
    }
    
    void Ort::ausgabe()  const  {
        std::cout << "Das Objekt enthaelt die Koordinaten: x = " << xKoord << ", y = " << yKoord << std::endl;
    }
    
    Ort::Ort() {                   //Eigener Standardkonstruktor
            xKoord = 0;
            yKoord = 0;
    }
    
    //main.cpp
    #include <iostream>
    #include "Ort.h"
    
    int main()
    {
        Ort einOrt;
        einOrt.ausgabe;
        einOrt.aendern(3,7);
        return 0;
    }
    

    Bekomme folgende Fehlermeldung:
    in main.cpp: line 8 error: statement cannot resolve adresse of overloaded function

    Was hab ich denn nun wieder nich verstanden?
    Danke für eure Hilfe!



  • Es muss heißen** einOrt.ausgabe(); **

    Gruß Blue-Tec



  • *hüsterchen* Dankeschön. 🙂



  • Ich habe jetzt einen allgemeinen Kontruktor geschrieben und bekomme seltsame ausgaben. Vlt. weiß da jemand Rat?

    //main.cpp
    #include <iostream>
    #include "Ort.h"
    
    int main()
    {
        Ort einOrt(0,0);
        //einOrt.ausgabe();
        einOrt.aendern(3,7);
        Ort nocheinOrt(2,4);            //Gibt ganz andere Zahlen aus?!
        nocheinOrt.ausgabe();
        return 0;
    }
    
    //Ort.cpp
    #include <iostream>
    #include "Ort.h"
    
    int Ort::getX() const   {return xKoord;}
    int Ort::getY() const   {return yKoord;}
    
    void Ort::aendern(int x, int y) {
        xKoord = x;
        yKoord = y;
    
        std::cout << "Ort-Objekt geaendert! x = " << xKoord << ", y = " << yKoord << std::endl;
    }
    
    void Ort::ausgabe()  const  {
        std::cout << "Das Objekt enthaelt die Koordinaten: x = " << xKoord << ", y = " << yKoord << std::endl;
    }
    
    /*
    Ort::Ort() {                   //Eigener Standardkonstruktor
            xKoord = 0;
            yKoord = 0;
    }
    */
    
    Ort::Ort(int x, int y)  {
            xKoord = x;
            xKoord = y;
    }
    
    //Ort.h
    #ifndef ORT_H_INCLUDED
    #define ORT_H_INCLUDED
    
    class Ort   {
    
        public:
            int getX() const;
            int getY() const;
            void aendern(int x, int y);
            void ausgabe() const;
            //Ort();                      //Eigener Standardkonstruktor
            Ort(int x, int y);
    
        private:
            int xKoord,
                yKoord;
    };
    
    #endif // ORT_H_INCLUDED
    


  • Sorry, gefunden.



  • Ort::Ort(int x, int y)  {
            xKoord = x;
            xKoord = y;
    }
    

    ist ok, aber besser ist:

    Ort::Ort(int x, int y) 
    : xKoord(x), yKoord(y) 
    {} 
    
    // oder sogar 
    
    Ort::Ort(int x = 0, int y = 0) 
    : xKoord(x), yKoord(y) 
    {}
    

    rya.



  • Scorcher24 schrieb:

    // oder sogar 
    
    Ort::Ort(int x = 0, int y = 0) 
    : xKoord(x), yKoord(y) 
    {}
    

    Davon rate ich ab, da diese Konstruktordefinition es erlaubt, Objekte auf folgende Weise zu erstellen:

    Ort a(5); // Wofür steht die 5? x=5? y=5? Warum nur eine Koordinate?
    
    Ort b = 7; // WTF?
    


  • Zwar Offtopic aber das mit den Paramtern haben sie in Python gut gelöst, da kann man angeben welchen Parameter man meint, wenn man nur einen übergibt aber mehrere gefordert werden. Auch die Reihenfolge ist dort nicht wichtig. Gibt es da in C++ einen Ansatz sowas mal mit einzubauen?

    Gruß Blue-Tec



  • blue-tec schrieb:

    Gibt es da in C++ einen Ansatz sowas mal mit einzubauen?

    Du weisst ja: Was einem C++ nicht als Sprachfeature bietet, kann man mit Template-Metaprogrammierung nachbauen. 😃

    Ein paar Boostler haben das sogar tatsächlich getan: Boost.Parameter

    Über Vorschläge, so ein Feature in die Sprache einzubauen, ist mir hingegen nichts bekannt.



  • Die sind ja verrückt die Boostler 😃
    Danke für den Hinweis.


Anmelden zum Antworten