noob hat probleme mit klassen...



  • hi... hab da ein problem mit den klassen in einer konsolenanwendung die die vier grundrechenarten auf zwei brüche anwenden soll. als ich gestern mit strukturen gemacht hab ging es... mit klassen sollte es also auch möglich sein.
    hier erst mal die klasse:

    class bruch
    {
    public:
    
    	int z;                                   //für den Zähler
    	int n;                                   //für den Nenner
    	bruch eingeben();                        //Methode zur Bruch-eingabe (wird zwei mal aufgerufen)
    	void ausgeben(bruch a);                  //Methode zur Bruch-ausgabe (wird drei mal aufgerufen)
    	bruch addieren(bruch a, bruch b);        //Methode zum addieren der Brüche
    };
    

    unter der klasse stehen folgende methoden:

    bruch bruch::eingeben()
    {
    	bruch bruch;
    	cout << "Geben Sie den Zaehler ein : ";
    	cin >> bruch.z;                               //z.b. die 3 bei 3/5
    	cout << "Geben Sie den Nenner ein : ";
    	cin >> bruch.n;                               //die 5 bei 3/5
    	cout << endl;
    return bruch;
    }
    
    void bruch::ausgeben(bruch a)
    {
    	cout << a.z << "/" << a.n;                    //--> x/x (z.b. 3/5)
    }
    
    bruch bruch::addieren(bruch a, bruch b)
    {
    	bruch ergebnis;
    	ergebnis.z = (a.z * b.n) + (a.n * b.z);    //so hat die rechnung bei
    	ergebnis.n = (a.n * b.n);                  //der struktur zumindest geklappt
    return ergebnis;
    }
    

    und in int main() steht folgendes:

    system("cls");                             //Bildinhalt löschen
    cout << "Bruch 1:" << endl;
    bruch::eingeben(bruch1);                   //Aufruf der eingeben-Methode(1)
    cout << "Bruch 2:" << endl;
    bruch::eingeben(bruch2);                   //Aufruf der eingeben-Methode(2)
    bruch::ausgeben(bruch1);                   //Aufruf der Ausgeben-Methode(1)
    cout << " + ";
    bruch::ausgeben(bruch2);                   //Aufruf der Ausgeben-Methode(2)
    cout << " = ";
    ergebnis = bruch1.addieren(bruch2);        //Berechnung des Ergebnisses
    bruch::ausgeben(ergebnis);                 //Aufruf der Ausgeben-Methode(3)
    

    hab das natürlich alles ein bisschen übersichtlicher im quelltext formatiert und die ganzen switch sachen usw weggelassen (es geht ja nur um den klassenkram).
    das mein code reichlich fehler ausgibt haben die profis ja schon erkannt. die fehler währe u.a. bruch::addieren/eingeben akzeptiert keinen 1 parameter und bruch::ausgeben unzulässiger aufruf einer nichtstatischen memberfunktion.

    ich, als absoluter noob, werde aus meinem buch nicht schlau was ich hätte anders machen können, da das beispiel aus dem buch vordefinierte werte (x und y koordinaten von vektoren) besitzt. mit dem eingeben war's also ein versuch von mir selbst. und damit ich die beiden ursprungsbüche nochmal ordentlich anzeigen kann, musste ich das mit der ausgabe auch verändern. und jetzt läuft garnix...
    ich hab irgendwie das gefühl das ich das mit den :: irgendwie falsch gemacht habe. aber deshalb bin ich ja hier.
    also, könnte mir da jemand helfen?
    vielen dank im voraus...



  • also :: (scpoeoperator) darf man nicht in main benutzen ... damit erklärst du dem compiler wie die funktion funktioniert zum ausgeben (.) benutzen.
    Gucke mir nun das an ^^

    nochwas:
    du kannst keine 2 werte zurückgeben mit einem return
    und das andere ist du hast z.b. bruch.z nicht initialisiert usw.

    am besten nochmal klassen und gültigkeitsbereiche lesen.

    mfg
    Coda



  • #include<iostream>
    
    using namespace std;
    
    class bruch
    {
    public:
        int z;
        int n;
        void eingeben();
        void ausgeben();
    };
    
    void bruch::eingeben()
    {
        cout << "Geben Sie den Zaehler ein : ";
        cin >> z;
        cout << "Geben Sie den Nenner ein : ";
        cin >> n;
        cout << endl;
    }
    
    void bruch::ausgeben()
    {
        cout << z << "/" << n;
    }
    
    bruch addieren(bruch a,bruch b)
    {
        bruch ergebnis;
        ergebnis.z = (a.z * b.n) + (a.n * b.z);
        ergebnis.n = (a.n * b.n);
    	  return ergebnis;
    }
    
    int main(void)
    {
    //system("cls"); gar nicht schön!
    cout << "Bruch 1:" << endl;
    bruch bruch1;
    bruch1.eingeben();
    cout << "Bruch 2:" << endl;
    bruch bruch2;
    bruch2.eingeben();
    
    bruch1.ausgeben();
    cout << " + ";
    bruch2.ausgeben();
    cout << " = ";
    bruch ergebnis;
    ergebnis = addieren(bruch1,bruch2);
    ergebnis.ausgeben();
    cout<<endl;
    }
    

    Da sträuben sich zwar immer noch die Nackenhaare, aber es läßt sich immerhin kompilieren 😃
    Kann mich Coda nur anschließen: am besten nochmal klassen und gültigkeitsbereiche lesen.



  • also ich hab jetzt erst mal aus z.b. bruch::eingeben(bruch2) bruch2.eingeben(bruch2) gemacht, wodurch schonmal einige fehler verschwunden sind.
    und wegen der sache mit dem return das zwei ergebnisse liefert: gilt das nur für klassen? bei meiner struktur version des programms hat's funktioniert (zufall?)... deshalb hab ich das ja auch so gemacht. oder meinst du damit die beiden unterschiedlichen brüche? dafür hab ich nämlich zwei methoden (bruch1 & bruch2) in der strukturversion gemacht.
    naja, ich probier' jetzt erst mal rum und schreib in zukunft in main nicht mehr ::... *g*
    danke für die hilfe...
    ps: als ich das geschrieben habe war der post von fubar noch net da... *g*



  • mh .. kann zwar nicht gut proggen... aber ich habe mir schwer getan so ein resultat zu bringen ^^ aber eins wäre besser ^^ mit return 0; in

    main();

    bei mir kommt eine warnung und warnungen sollte man nicht ignorieren ^^
    und
    von mir ne frage

    wäre es sinnvoll z und n privat zu halten ?



  • bin hier gerade heftigst am vergleichen und kann eigentlich keine unterschiede finden. aber es geht trotzdem net... 😕
    iss wohl irgendwo ein tippfehler...
    aber wieso nicht system("cls");? und wenn nicht das, was dann? würd gerne auf irgendeine weise den bildschirminhalt löschen. wenn's ne bessere möglichkeit gibt bin ich dafür gerne offen...
    @coda: in dem beispiel aus dem buch von mir wurden die privat gehalten. hab's nur net gemacht weil ich sonst noch weniger auf die beine stellen würde... aber auf jeden fall war es in dem buch so, das n und z schon im code definiert wurden. wie's aussieht wenn man das mit cin machen will weiß ich leider auch noch nicht... wollte halt was sagen... du weißt schon, geben und nehmen... *g*



  • IMHO muß da kein return 0; stehen, da der Compiler es freiwillig einfügt, wenn da nichts anderes steht...
    Bei mir (gcc version 3.3 20030226 (prerelease)) gibt es auch keine Warnung.

    @Profis: bitte korrigieren!

    <edit>
    3.6.1 Main function [basic.start.main]
    "A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;"
    </edit>



  • jetzt funktioniert es... ABER: das ergebnis von 2/4 + 2/4 ist dem programm nach 1/4362288 + 1/4362288 = 8724576/-1443493632...
    ein bug gibt's also schonmal zu fixen... hab ich nun getan indem ich bei bruch::eingeben() das bruch bruch; weggemacht habe was ich da noch hatte... aber warum musste das weg? weil's ne void funktion ist?
    und nochwas: beim funktionierenden code (von fubar) ist addieren kein bestandteil der klasse mehr... sollte es aber sein... gibt's da denn keine möglichkeit das da reinzubringen?



  • class bruch 
    { 
    public: 
        int z; 
        int n; 
        void eingeben(); 
        void ausgeben(); 
        void addiere(bruch &a);
    };
    
    //...
    
    void bruch::addiere(bruch &a)
    {
      z+=a.z;
      n+=a.n;
    }
    
    //...
    
    bruch1.addiere(bruch2);
    bruch1.ausgeben();
    

    Oder halt Operatorüberladung...



  • hhmm... ich les' wohl am besten erst noch mal ne weile im buch bevor ich hier mit 1000 fragen komme... das bruch &a sagt mir z.b. garnix... wird wohl noch später im buch erwähnt...
    trotzdem danke für die hilfe...



  • szallah ... ich kann auch kaum proggn ^^, aber das ist was beste was du machen kannst, guck dir am besten gültigkeitbereiche an usw. da lernste am anfang am meisten ^^


Anmelden zum Antworten