Code funzt net!



  • Also, ich hab wieder mal en Problem...
    Ich hab ein kleines Versuchsprogramm zu einer Klasse geschrieben, bei der syntaxüberprüfung werden keine Fehler gemeldet! Kompilier ich aber, krieg ich en haufen linker errors! Woran kann das liegen? (Wenn ihr wllt poste ich den code auch, vielleicht 100 Zeilen...)



  • Ach und Du denkst jetzt wir könnten Dir helfen ohne weitere Infos?

    Wir machen oft für andere die Hausaufgaben, aber sehen was Dein Compiler ausspuckt und code sehen wir nicht.



  • Eventuell reicht ja auch erstmal die Fehlermeldung. So kann man natürlich weniger als nix dazu sagen.



  • 1)Inlcude nochmal checken
    2)libs gelinkt?
    3)undefinierte funktion?
    4)extern vergessen?

    Bevor du Code oder Fehler postest, check das nochmal nach.



  • OK, darum frag ich ja!

    [Linker error] undefined reference to `Rational::Rational(int, int)'

    So in dem stil geht das noch ziemlich lange weiter! Das wird vmtl. net viel helfen daher poste ich einfach alles!

    main.cpp:

    #include <iostream>
    #include "rational.h"
    using namespace std;
    
    int main()
    {
        int zaehler1;
        int nenner1;
        int zaehler2;
        int nenner2;
        cout<<"Bitte geben sie den Zaehler der ersten Zahl ein: ";
        cin>>zaehler1;
        cout<<endl<<"Bitte geben sie den Nenner der ersten Zahl ein: ";
        cin>>nenner1;
        Rational a(zaehler1, nenner1);
        a.print();
        cout<<endl<<"Bitte geben sie den Zaehler der zweiten Zahl ein: ";
        cin>>zaehler2;
        cout<<endl<<"Bitte geben sie den Nenner der zweiten Zahl ein: ";
        cin>>nenner2;
        Rational b(zaehler1, nenner1);
        b.print();
        Rational ausgabe(4, 2);
        bool weiter=true;
        int operation;
        while (weiter==true)
        {
        cout<<"Welche Operation soll mit den beiden Zahlen ausgeführt werden?"<<endl
        <<"1 - Addition"<<endl<<"2 - Subtraktion"<<endl<<"3 - Multiplikation"<<endl<<"4 - Division"
        <<endl;
        cin>>operation;
        switch(operation)
        {
            case 1:
                ausgabe=a+b;
                weiter=false;
                break;
            case 2:
                ausgabe=a-b;
                break;
                weiter=false;
            case 3:
                ausgabe=a*b;
                break;
                weiter=false;
            case 4:
                ausgabe=a/b;
                break;
                weiter=false;
            default:
                cout<<"Nicht belegt!"<<endl;
        };
        };
        if (operation==1) cout<<a.print()<<"+"<<b.print()<<"="<<ausgabe.print();
        if (operation==2) cout<<a.print()<<"-"<<b.print()<<"="<<ausgabe.print();
        if (operation==3) cout<<a.print()<<"*"<<b.print()<<"="<<ausgabe.print();
        if (operation==4) cout<<a.print()<<"/"<<b.print()<<"="<<ausgabe.print();
        cout<<endl<<"Programm mit Tastendruck beenden!";
        cin.get();        
    };
    

    rational.cpp

    #include <iostream>
    #include "mymath.h"
    using namespace std;
    class Rational
    {
    private:
       int m_zaehler;
       int m_nenner;      
    
       int kuerzen()
       {
          int ggtVar=ggt(m_zaehler,m_nenner);
          m_zaehler/=ggtVar;
          m_nenner/=ggtVar;
       };
    
    public:
       Rational(int zaehler,int nenner)
       {
          m_zaehler=zaehler;
          m_nenner=nenner;
          kuerzen();
       };
    
       Rational(int zahl)
       {
          m_zaehler=zahl;
          m_nenner=1;
       };
    
          Rational operator*(Rational rhs)
       {
          int resultZaehler=m_zaehler*rhs.m_zaehler;
          int resultNenner=m_nenner*rhs.m_nenner;
          Rational result(resultZaehler,resultNenner);
          return result;
       };
    
       Rational operator+ (Rational rhs)
       {
           int newnenner=m_nenner*rhs.m_nenner;
           int lhszaehler=m_zaehler*rhs.m_nenner;
           int rhszaehler=m_nenner*rhs.m_zaehler;
           int newzaehler=rhszaehler+lhszaehler;
           Rational result(newzaehler, newnenner);
           return result;
       };
    
       Rational operator- (Rational rhs)
       {
           int newnenner=m_nenner*rhs.m_nenner;
           int lhszaehler=m_zaehler*rhs.m_nenner;
           int rhszaehler=m_nenner*rhs.m_zaehler;
           int newzaehler=rhszaehler-lhszaehler;
           Rational result(newzaehler, newnenner);
           return result; 
       };
    
       Rational operator/ (Rational rhs)
       {
           int resultZaehler=m_zaehler*rhs.m_nenner;
           int resultNenner=m_nenner*rhs.m_zaehler;
           Rational result(resultZaehler,resultNenner);
           return result;
       };               
    
       int print()
       {
            cout<<m_zaehler<<'/'<<m_nenner;
       };
    };
    

    rational.h
    (hier ist bestimmt der Fehler??

    class Rational
    {
        private:
            int m_zaehler;
            int m_nenner;
            int kuerzen();
        public:
            Rational(int zaehler,int nenner);
            Rational(int zahl);
            Rational operator*(Rational rhs);
            Rational operator+ (Rational rhs);
            Rational operator- (Rational rhs);
            Rational operator/ (Rational rhs);
            int print();
    };
    

    und dann noch mymath, aber das is egal...



  • Wieso definierst du die Klasse im Header UND in der cpp?



  • randa schrieb:

    1)Inlcude nochmal checken
    2)libs gelinkt?
    3)undefinierte funktion?
    4)extern vergessen?

    Bevor du Code oder Fehler postest, check das nochmal nach.

    1. Siehe vorheriger post (hab ich net erst 1 mal gemacht)
    2. Hab ich net, oder (Was genau is dat?)
    3. Ne
    4. Was'n dat?

    Das Letzte) Zu spät!



  • print sollte was returnen, schließlich hast du es als int-rückabe deklariert.
    int rational.h solltest du einen include guard hinmachen.

    PS: Mir scheint, als ob du Ulrich Breymanns C++ - Eine Einführung benutzt, sehe ich das richtig? 🙂

    Edit: und deine klasse ist zweimal definiert.



  • @Interpreter: Deklarier ich se net in der header und definier se in der cpp? Sonst gehts jedenfalls net (Bei der syntaxüberprüfung)! (Siehe auch den Thread Klasse über header prototyp deklarieren)

    @randa: Ich weiß, die Leute legen viel wert auf guten stil, aber ich glaub dev-cpp macht das selber. Ich machs trotzdem mal... was is ein include guard? Heißt der nicht Volkard Henkel? 😃



  • ein include guard ist:

    #ifndef RATIONAL_H_INCLUDED
    #define RATIONAL_H_INCLUDED
    //Klasse...
    #endif
    

    anstatt Rational_h_included kannst du auch was anderes nehmen, es muss aber gleich sein.
    Das bewirkt, das der compiler die Datei nur einmal in eine andere Datei einbindet und somit keine multiple definition gemeckert wird. wenn du mehrere header in einrer cpp hast, von denen mehrere rational.h einbinden, dann brauchst du das.



  • OK, nun hab ich auch einen include guard...
    Das hilft mir aber alles net weiter! Immer noch das selbe Problem...
    Wenn ihr alle feststellt das ich die Klasse 2 mal definiere, könnte mir bitte jemand sagen welches stück code ich löschen muss? Wie gesagt, meiner Meinung nach geht aus dem anderen Thread hervor das ich die Klasse einmal definiere (cpp) und einmal deklariere...



  • definiere deine Klasse in der headerdatei, so wie bisher.
    in der cpp datei schreibst du:

    Rückgabewert Klasse::Methode (Parameterliste)
    {
    	Implementation
    }
    

    Die Namen sind selbstredend. Du implmenetierst die Funktionen (Methoden) ganz normal, nur mit dem Bereichsoperator :: um klar zu machen, das diese Methode der entsprechenden Klasse angehört.



  • Eine Klasse zu deklarieren wäre sowas:

    class Foo;
    

    Du *definierst* die Klasse aber zweimal, einmal im Header und einmal in der .cpp.
    Im Header ist es richtig. In der .cpp definierst du nur noch die Methoden, die du im Header in der Klassendefinition deklariert hast.

    Übernimm es jetzt einfach so und denk dann erst drüber nach.

    Header:
    class Foo
    {
    void method();
    };

    .cpp:

    void Foo::method()
    {
    // code
    }



  • Ah, jetzt wirds tag...
    Also muss ich:

    int Rational::kuerzen()
       {
          int ggtVar=ggt(m_zaehler,m_nenner);
          m_zaehler/=ggtVar;
          m_nenner/=ggtVar;
       };
    

    statt:

    int kuerzen()
       {
          int ggtVar=ggt(m_zaehler,m_nenner);
          m_zaehler/=ggtVar;
          m_nenner/=ggtVar;
       };
    

    schreiben, oder so? Dann bekomm ich die Fehlermeldung:
    1 C:\DOKUME1\TOM\EIGENE1\C__~1\Projekte\Rational\Rational.cpp syntax error before `::' token

    Achja, und wie muss das beim Konstruktor sein? So?
    Rational Rational::(int zaehler,int nenner)

    {
          m_zaehler=zaehler;
          m_nenner=nenner;
          kuerzen();
       };
    


  • du musst in die cpp datei auch den header einbinden.

    Beim Konstruktor schreibst du Rational::Rastional () oder Rational::Rational (int zaehler, int nenner).
    Da der Konstruktor nix zurückgibt, fällt das halt einfach weg.



  • Jetzt klappt fast alles! Nur noch ein paar Fehler nach dem stil:
    main.cpp C:\DOKUME1\TOM\EIGENE1\C__~1\Projekte\Rational\codes\main.o(.text+0x0) multiple definition of `ggt(int, int)'
    Was 'n das? Ich weiß net wo ich ggt 2 mal definiert hab? Nur 1 mal in mymath.h...

    int ggt(int a,int b)
    {
    // a soll größer als b sein
       a=abs(a);
       b=abs(b);  // Immer positive Werte nehmen
    
       if(b>a)
          return ggt(b,a);
    
       if(b!=0)
          return ggt(b,a%b);
       else
           return a;
    };
    
    int kgv(int a,int b)
       {
          return a*b/ggt(a,b);
       };
    

Anmelden zum Antworten