Funktionsaufruf



  • OK, ich ver suche einen ganz simplen Taschenrechner zu programmieren, der Quelltext ist:

    class.hpp :
    
    class rech
    {
    public:
       int multi ();
       int divi ();
       int summ ();
       int diff ();
       int ergeb ();
    
    private:
       int ergebnis;
    };
    
    main.cpp :
    
    #include "iostream.h"   //fuer cout und cin
    #include "class.hpp"
    
    int funk = 1;
    
    //Funktion zum Addieren
    
    int rech::summ ()
    {
       int summ1;
       int summ2;
    
       cout << "Bitte den 1. Summanden eingeben.\n";
    
       cin >> summ1;
    
       cout << "Bitte den 2. Summanden eingeben.\n";
    
       cin >> summ2;
    
       //rechenvorgang
    
       ergebnis = summ1 + summ2;
    
       int rech::ergeb ();
       int main ();
       return 0;
    }
    
    //Funktion zum Subtrahieren
    
    int rech::diff ()
    {
       int sub;
       int min;
    
       cout << "Bitte den Subtrahenten eingeben.\n";
    
       cin >> sub;
    
       cout << "Bitte den Minuenden eingeben.\n";
    
       cin >> min;
    
       //rechnung
    
       ergebnis = sub - min;
    
       int rech::ergeb ();
       int main ();
       return 0;
    }
    
    //Funktion zum Multipliezieren
    
    int rech::multi ()
    {
       int Faktor1;
       int Faktor2;
    
       cout << "Bitte den 1. Faktor eingeben.\n";
    
       cin >> Faktor1;
    
       cout << "Bitte den 2. Faktor eingeben.\n";
    
       cin >> Faktor2;
    
       //rechenvorgang
       ergebnis = Faktor1 * Faktor2;
    
       return 0;
    }
    
    //Funktion zum Dividieren
    
    int rech::divi ()
    {
       int dividend;
       int divisor;
    
       cout << "Bitte geben sie den Dividenden ein.\n";
    
       cin >> dividend;
    
       cout << "Bitte den Divisor eingeben.\n";
    
       cin >> divisor;
    
       //rechenvorgang
       ergebnis = dividend / divisor;
    
       return 0;
    }
    
    //Ergebnisausgabe
    
    int rech::ergeb ()
    {
       cout << "Das ergebnis ist:\t   " << ergebnis;
    
       return 0;
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////Main/////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////
    
    int main ()
    {
       cout << "Welche Funktion moechten sie benutzen?\n\n";
       cout << "(1)\t   Addieren\n";
       cout << "(2)\t   Subtrahieren\n";
       cout << "(3)\t   Multiplizieren\n";
       cout << "(4)\t   Dividieren\n";
       cout <<   "(5)\t   Beenden\n";
    
       cin >> funk;
    
       //////////////
       if (funk == 1)
       {
          rech::summ ();                  // <- Fehler hier
       }
       //////////////
       if (funk == 2)
       {
          rech::diff ();                  // <- Fehler hier
       }
       //////////////
       if (funk == 3)
       {
          rech::multi ();                 // <- Fehler hier
       }
       //////////////
       if (funk == 4)
       {
          rech::divi ();                  // <- Fehler hier
       }
       //////////////
       if (funk == 5)
       {
          return 0;
    
       }
    
       return 0;
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    

    So, aber hier bekomme ich ne Fehlermeldung, die ich nicht wegkriege, die Fehler liegen bei "<- Fehler hier" (und in der class.hpp). Die Fehlermeldung ist:

    --------------------Konfiguration: Taschenrechner - Win32 Debug--------------------
    Kompilierung läuft...
    main.cpp
    C:\Eigene Dateien\My Programms\Taschenrechner\main.cpp(134) : error C2352: 'rech::summ' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
    c:\eigene dateien\my programms\taschenrechner\class.hpp(7) : Siehe Deklaration von 'summ'
    C:\Eigene Dateien\My Programms\Taschenrechner\main.cpp(139) : error C2352: 'rech::diff' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
    c:\eigene dateien\my programms\taschenrechner\class.hpp(8) : Siehe Deklaration von 'diff'
    C:\Eigene Dateien\My Programms\Taschenrechner\main.cpp(144) : error C2352: 'rech::multi' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
    c:\eigene dateien\my programms\taschenrechner\class.hpp(5) : Siehe Deklaration von 'multi'
    C:\Eigene Dateien\My Programms\Taschenrechner\main.cpp(149) : error C2352: 'rech::divi' : Unzulaessiger Aufruf einer nichtstatischen Member-Funktion
    c:\eigene dateien\my programms\taschenrechner\class.hpp(6) : Siehe Deklaration von 'divi'
    Fehler beim Ausführen von cl.exe.

    Taschenrechner.exe - 4 Fehler, 0 Warnung(en)

    Helft mir!!!!!!! 😞

    Bye

    Edit by SideWinder: Nächstes mal bitte selbst Code-Tags verwenden!

    [ Dieser Beitrag wurde am 08.03.2003 um 13:26 Uhr von SideWinder editiert. ]



  • Keine Ahnung aber eine kleine Optimierung:

    /* switch */
    switch(funk)
    case 1:
    {
    rech::summ (); // <- Fehler hier
    break;
    }
    
    case 2:
    {
    rech::diff (); // <- Fehler hier
    break;
    }
    
    case 3:
    {
    rech::multi (); // <- Fehler hier
    break
    }
    
    case 4:
    {
    rech::divi (); // <- Fehler hier
    break;
    }
    
    case 5:
    {
    return 0;
    break;
    }
    default: 
    cout << "Es ist ein Fehler aufgetreten.\n";
    

    So müsste es gehen 😃 😃

    Edit:
    Ich hatte noch etwas vergessen:
    wo benutzt du denn mal die funktion int rech::ergeb () ?
    Und 2. warum machst du funktionen mit Rückgabewert gleich int?
    Mach doch mit void und lass das return 0;einfach weg wenn dus schon nicht abfragst. 😃

    [ Dieser Beitrag wurde am 07.03.2003 um 20:27 Uhr von quizzmaster editiert. ]



  • Danke,
    werd ich gleich ausprobieren, rech::ergeb () hab ich wohl aus lauter ärger ganz vergessen (rech::multi und rech::divi hab ich erst später eingebunden). Und, dass ich swith ganz vergessen hab kommt mir selbst spanisch vor.



  • Der fehler ist der Doppelpunkt (rech::summ() ). Damit wird eine Methode einer Klasse definiert. Du willst aber nur die Funktion aufrufen, da du sie ja schon oben definiert hast. Dazu musst du erst einmal eine Instanz deiner Klasse anlegen. Das machst du mit "rech instanz; " ,
    also wie eine Variable, nur dass der Typ halt der Name deiner Klasse ist. Dieses Objekt "instanz" hat dann alles, was deine Klasse hat. Um jetzt auf eine Methode (bei Klassen heisst das Methoden statt Funktionen) zuzugreifen, gibst du den Namen der Instanz an (hier "instanz"), gefolgt von einem Punkt (.). Dann sollte sich automatisch ein Fenster öffnen, in dem alle Elemente deiner Klasse stehen. Da kannst du dann die Funktion aussuchen, oder aber auch manuell z.B. "instanz.summ();" eintippen. Das bedeutet dann, dass die Methode "summ" der Klasse rech aufgerufen wird, da ja "instanz" vom Datentyp "rech" ist. Ich hab dir hier mal den reparierten Quellcode gepostet:

    //////////////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////Main/////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////
    
    int main ()
    {
        //HIER WIRD DIE INSTANZ DER KLASSE ANGELEGT
        rech instanz;
    
       cout << "Welche Funktion moechten sie benutzen?\n\n";
       cout << "(1)\t   Addieren\n";
       cout << "(2)\t   Subtrahieren\n";
       cout << "(3)\t   Multiplizieren\n";
       cout << "(4)\t   Dividieren\n";
       cout <<   "(5)\t   Beenden\n";
    
       cin >> funk;
    
       //////////////
       if (funk == 1)
       {
           //rech::summ (); 
              instanz.summ(); //HIER DER RICHTIGE FUNKTIONSAUFRUF       
       }
       //////////////
       if (funk == 2)
       {
             //rech::diff (); 
         instanz.diff(); //HIER DER RICHTIGE FUNKTIONSAUFRUF
       }
       //////////////
       if (funk == 3)
       {
          //rech::multi (); 
         instanz.multi(); //HIER DER RICHTIGE FUNKTIONSAUFRUF
       }
       //////////////
       if (funk == 4)
       {
          //rech::divi (); 
          instanz.divi(); //HIER DER RICHTIGE FUNKTIONSAUFRUF
       }
       //////////////
       if (funk == 5)
       {
          return 0;
    
       }
       instanz.ergeb(); //DIE ERGEBNISAUSGABE WIRD JETZT AM ENDE AUFGERUFEN
    
       return 0;
    }
    //ENDE
    

    So müsste es meiner Meinung nach gehen.
    Hoffe es war halbwegs verständlich.
    Gruß ethereal



  • Ganz vergessen:
    Die Header-Datei und die Definition musst du natürlich noch alle hinzufügen.
    Das ist nur die Main-Funktion, in der was verändert werden muss, deswegen hab ich ja nur die gepostet.
    Gruß ethereal


Anmelden zum Antworten