Taschenrechner in Klasse



  • Hallo ich habe mir gerade mal einen Taschenrechner gemacht welcher in einer Klasse ist.

    Das Programm funktioniert zwar aber ich bekomme immer diese Warnung ausgeben:

    C++ Warnung] Unit1.cpp(72): W8060 Möglicherweise inkorrekte Zuweisung
    [C++ Warnung] Unit1.cpp(80): W8060 Möglicherweise inkorrekte Zuweisung
    [C++ Warnung] Unit1.cpp(89): W8004 'wahl' wurde ein Wert zugewiesen, der nie verwendet wird

    Hier ist mal der Quellcode:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    // Klassendefinition
    class rechner
    {
    
    int wahl;
    
    public:
    // Memberfunktionen
    
    int calc();
    int rechne();
    int test();
    
    };
    
    // Definition der Memberfunktionen
            int calc()
            {
            int wahl;
            cout<<"(1) Addieren\n";
            cout<<"(2) Subtrahieren\n";
            cin>>wahl;
            return 0;
            }
    
    int rechne()
    {
    int zahl1,zahl2,erg;
    cout<<"du bist in der addier funktion\n";
    cout<<"erste zahl eingeben\n";
    cin>>zahl1;
    cout<<"zweite zahl eingeben\n";
    cin>>zahl2;
    erg = zahl1+zahl2;
    cout<<erg;
    system("PAUSE");
    return 0;
    }
    
            int test()
            {
            int zahl1,zahl2,erg;
            cout<<"du bist in der subtrahier funktion\n";
            cout<<"erste zahl eingeben\n";
            cin>>zahl1;
            cout<<"zweite zahl eingeben\n";
            cin>>zahl2;
            erg = zahl1-zahl2;
            cout<<erg;
            system("PAUSE");
            return 0;
            }
    
    // HAUPTPROGRAMM
    int main()
    
    {
    
    int wahl;
    
    calc();
    
    if (wahl=1)
    {
    rechne();
    return 0;
    }
    
    if (wahl=2)
    {
    test();
    return 0;
    }
    
    system("PAUSE");
    }
    


  • Hallo

    Sehr gute und aussagekräftige Meldung des Compilers.

    = ist eine Zuweisung
    == ist ein Vergleich

    Da du sicher letzteres willst, solltest du den Code ändern.

    chrische



  • Die ersten beiden Meldungen besagen, daß du Zuweisung = und Vergleich == durcheinandergebracht hast. Die letzte sagt, daß der Wert von wahl nirgends gelesen wird.

    Aber: wenn du die oberen Meldungen korrigierst, hast du in wahl plötzlich einen undefinierten Wert. Du mußt den Rückgabewert von calc() auch irgendwem zuweisen:

    int main()
    {
      int wahl;
      wahl=calc();
    
      if (wahl==1)
      {
        rechne();
        return 0;
      }
      if (wahl==2)
      {
        test();
        return 0;
      }
    }
    


  • Ich hab das jetzt so gemacht:

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    // Klassendefinition
    class rechner
    {
    
    public:
    // Memberfunktionen
    
    int calc();
    int rechne();
    int test();
    
    };
    
    // Definition der Memberfunktionen
            int calc()
            {
            int wahl;
            cout<<"(1) Addieren\n";
            cout<<"(2) Subtrahieren\n";
            cin>>wahl;
            return 0;
            }
    
    int rechne()
    {
    int zahl1,zahl2,erg;
    cout<<"du bist in der addier funktion\n";
    cout<<"erste zahl eingeben\n";
    cin>>zahl1;
    cout<<"zweite zahl eingeben\n";
    cin>>zahl2;
    erg = zahl1+zahl2;
    cout<<erg;
    system("PAUSE");
    return 0;
    }
    
            int test()
            {
            int zahl1,zahl2,erg;
            cout<<"du bist in der subtrahier funktion\n";
            cout<<"erste zahl eingeben\n";
            cin>>zahl1;
            cout<<"zweite zahl eingeben\n";
            cin>>zahl2;
            erg = zahl1-zahl2;
            cout<<erg;
            system("PAUSE");
            return 0;
            }
    
    // HAUPTPROGRAMM
    int main()
    
    {
    
    int wahl;
    
    wahl=calc();
    
    if (wahl==1)
    {
    rechne();
    return 0;
    }
    
    if (wahl==2)
    {
    test();
    return 0;
    }
    
    system("PAUSE");
    }
    

    Aber wenn ich dann z.b. die 1 für Addieren drücke dann steht da halt nur von system("PAUSE"); drücken sie bitte eine beliebige taste und wenn ich dann irgendwas drücke geht das Programm einfach wieder aus.



  • Wie wäre es, wenn du auch den eingelesenen Wert aus der calc() zurückgibst 😉 Schließlich will das Hauptprogramm wissen, was der Nutzer ausgewählt hat.



  • Kann auch sein, dass ich jetzt etwas blind bin, aber müsste nicht erstmal ein Objekt der Klasse erzeugt werden?
    Wozu überhaupt eine Klasse, wenn da sowieso nur Funktionen drin sind und keine Membervariablen?
    Und überhaupt: wenn die Memberfunktionen außerhalb der Klasse definiert werden sollen, muss das doch so laufen: "int rechner::calc()", da sonst die Funktion nicht zur Klasse gehört.

    mit verwirrten Grüßen,

    U-Boot



  • jetzt wo dus sagst, Uboot... es gibt da einmal die Klassendefinition, in der die memberfunktionen deklariert werden. Der abschnitt danach ist aber mitnichten die Definition der Memberfunktionen, sondern eine definition von freien Funktionen, die mit den Membern nichts gemeinsam haben (ausser vielleicht dem Namen). Im main() rufst du dann auch nur diese freien Funktionen auf, die Klassendefinition wird also ueberhaupt nicht genutzt.



  • mhhm dann hab ich da wohl was falsch gemacht.

    Wie müsste das den dann eigentlich aussehen o_O



  • Wenn du die Klassenmethoden definierst, mußt du jeweils den Klassennamen "rechner::" davorstellen. Und außerdem brauchst du ein Objekt vom Typ 'rechner', um dann dessen Methoden aufrufen zu können.

    (aber U-Boot hat recht - eine Klasse nur als Sammlung von Methoden zu verwenden ist reichlich witzlos)



  • ok thx

    dann werd ich nochmal im Tutorial lesen.



  • Durch qualifizieren der Klasse bei der Definition der memberfunktionen:

    //Definition der Meberfunktionen
    int rechner::calc() {
      /*...*/
    }
    int rechner::rechne() {
      /*...*/
    }
    //usw.
    

    Dann wuerde ich die methoden noch etwas umbenennen damit schon aus dem Namen ersichtlich ist, was sie machen. Und am Ende kannst du noch folgendes machen:

    class rechner {
    /*...*/
    private: 
      int calc();   // Die alle
      int rechne(); // entsprechend
      int test();   // umbenennen
    public:
      void run();
    };
    
    void rechner::run() {
      int wahl=calc();
      switch (wahl) {
        case 1: rechne(); break;
        case 2: test(); break;
      }
    }
    
    int main () {
      rechner r;
      r.run();
    
      system("PAUSE");
    }
    


  • Hallo

    [quote="CStoll"

    (aber U-Boot hat recht - eine Klasse nur als Sammlung von Methoden zu verwenden ist reichlich witzlos)[/quote]

    Obwohl das bei reinen OOP-Sprachen ja Gang und Gebe ist. In c++ würde ich aber einen namespace gegenüber statischen Methoden vorziehen.

    chrische



  • chrische5 schrieb:

    Obwohl das bei reinen OOP-Sprachen ja Gang und Gebe ist. In c++ würde ich aber einen namespace gegenüber statischen Methoden vorziehen.

    C++ ist aber keine reine OOP-Sprache 😉



  • mhhm irgendwie versteh ich das da nicht so ganz.

    Kann mir vielleicht wer einen kleinen beispiel source code geben ?

    Es braucht nur ein ganz simples Programm zu sein um so leichter um so besser ^^



  • Du hattest doch gestern einige Fragen zu einem C++ Tutorial (Thema "Parameter einer Funktion") - wenn du dort etwas weiter blätterst, findest du auch Erklärungen und Beispiele zu Klassen.



  • @CStoll da hab ich ja schon gelesen aber irgenwie brachte mir das auch nicht als so viel.

    Aber Pumuckel hier blick ich net durch o_O

    class rechner { 
    /*...*/ 
    private: 
      int calc();   // Die alle 
      int rechne(); // entsprechend 
      int test();   // umbenennen 
    public: 
      void run(); 
    }; 
    
    void rechner::run() { 
      int wahl=calc(); 
      switch (wahl) { 
        case 1: rechne(); break; 
        case 2: test(); break; 
      } 
    } 
    
    int main () { 
      rechner r; 
      r.run(); 
    
      system("PAUSE"); 
    }
    

    was is den z.b. rechner r; 😮



  • "rechner r;" erzeugt ein Objekt deiner Klasse "rechner" (aka eine Variable "r" vom Typ "rechner"). Di benötigst du, um anschließend auf die Methoden der Klasse zugreifen zu können (über "r.run();" in der nächsten Zeile).

    PS: Ich hab' dein Tutorial zwar nur überflogen - aber daß es so schlecht ist, glaube ich nun wirklich nicht.



  • "rechner" ist die Klasse, und "r" ist ein Objekt, welches vom Typ "rechner" ist.

    Lies Dir doch nochmal das Kapitel über Klassen und Objekte durch 😉



  • mit rechner r; erstellst du ein Objekt der Klasse rechner, genauso wie du mit int zahl; eine int variable erstellt hast. Wenn dein C++-Tutorial ein gutes ist und nicht erst lange um den heissen Brei redet, solltest du was in der Art eigentlich auf den ersten 10-20 Seiten gelesen haben. Falls nicht, lies es nochmal bzw. lies es weiter, oder lies noch ein anderes Tutorial, bis du weisst, was Klassen sind und wie man damit umgeht. Aller Anfang ist schwer, und es ist wichtig, geduldig zu sein und sich erstmal mit den basics vertraut zu machen, bevor man sich an etwas vergleichsweise Umfangreiches wie einen Taschenrechner macht (was dich aber auf keinen Fall entmutigen sollte!)



  • @CStoll das tutorial ist nicht schlecht 🙂

    Dann werd ich mir das nochmal durchlesen.


Anmelden zum Antworten