Bitte um Hilfe



  • Hallo

    Vermutlich ist es besser wenn du dir die Grundlagen der OOP anschaust.

    bis bald
    akari



  • chrische5 schrieb:

    Hallo

    Ist doch wunderbar, dass du es alleine gelöst hast.

    chrische

    Dem entnehme ich jetzt einfach mal das ich die Lösung wohl gefunden habe.

    Ich möcht dabei mal auf eine Compiler Warnung zu sprechen kommen die mein dev-C++ immer ausgibt.

    32:2 C:\Dev-Cpp\include\c++\3.4.2\backward\backward_warning.h #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.

    Ich kann damit jetzt nicht so richtig was anfangen, worüber beschwert er sich nun?

    EDIT: Danke für den Link, das werd ich mal durch lesen!



  • Hallo

    Mach mal das .h nach iostream weg. Schreib also einfach

    #include <iostraem>
    

    uns schreibst dann noch

    using namespace std;
    

    drunter und alles wird gut. Du kannst alternativ ber auch immer:

    std::cout
    

    und so weiter schreiben.

    chrische



  • Erstmal vielen dank für die Hilfe.

    Ich hab nun mal probeweise ein kleine Programm geschrieben und hab hier nun ein Problem, erstmal der Code:

    #include <iostream>
    using namespace std;
    
    class Ressourcen
    {
    
                    public:
                           Ressourcen (int Arbeiter);
                           ~Ressourcen() {}
    
                           int Metall(int Metall, int Arbeiter)
                           {
                             itsMetall = Metall; 
                             itsMetall = Arbeiter * 3;
                             return itsMetall;
                           }
    
                           int Sillizium(int Sillizium, int Arbeiter)
                           {
                              itsSillizium = Sillizium;
                              itsSillizium = Arbeiter * 2;
                              return itsSillizium;
                           }                                      
    
                           int Deuterium(int Deuterium, int Arbeiter)
                           {
                               itsDeuterium = Deuterium;
                               itsDeuterium = Arbeiter * 1;
                               return itsDeuterium;    
                           }
    
                           void SetArbeiter(int Arbeiter) 
                           { 
                              itsArbeiter=Arbeiter; 
                           }
    
                           int GetMetal() const { return itsMetall; }
                           int GetSillizium() const { return itsSillizium; }
                           int GetDeuterium() const { return itsDeuterium; }
    
                    private:
    
                            int itsArbeiter;
                            int itsMetall;
                            int itsSillizium;
                            int itsDeuterium;
    };
    
    main()
    {
          Ressourcen MyRessourcen(int Arbeiter);
    
          int Arbeiter;
    
          cin >>Arbeiter;
          MyRessourcen.SetArbeiter(int Arbeiter);
    
          return 0;
    }
    

    Wieso kann ich keine werte an SetArbeiter übergeben? Was mach ich den da falsch?

    P.S

    Ich habe mir mittlerweile das Tutorial ein wenig angesehen, und finde es im großen und ganzen garnicht schlecht, aber der Autor beschreibt kaum was er da gerade tut bzw. warum.

    Ist das ganze eher ein Tutorial für fortgeschrittene?

    Im großen und ganzen auf jedenfall sehr hilfreich! 👍



  • Hi,

    Erstmal int main()...auch wenn dein Compiler int bei fehlendem Typen annimmt ist das nicht Standard!

    so isses richtig (du hast Typen gesetz, wo keine hingehören):

    int main()
    {
          int iArbeiter, iAndererArbeiter;
    
          cin >> iArbeiter;
          Ressourcen MyRessourcen(iArbeiter);
    
          // ein anderer Arbeiter:
          cin >> iAndererArbeiter;
    
          MyRessourcen.SetArbeiter(iAndererArbeiter);
    
          return 0;
    }
    


  • Moin,

    vielen dank für die schnelle hilfe, scheint nun soweit alles richtig zu sein, aber nun meckert der linker rum!

    Fehlermeldung:
    [Linker error] undefined reference to `Ressourcen::Ressourcen(int)'
    ld returned 1 exit status

    Ich verwende übrigens Dev_C++.

    #include <iostream>
    using namespace std;
    
    class Ressourcen
    {
    
                    public:
                           Ressourcen (int Arbeiter);
                           ~Ressourcen() {}
    
                           int Metall(int Metall, int Arbeiter)
                           {
                             itsMetall = Metall; 
                             itsMetall = Arbeiter * 3;
                             return itsMetall;
                           }
    
                           int Sillizium(int Sillizium, int Arbeiter)
                           {
                              itsSillizium = Sillizium;
                              itsSillizium = Arbeiter * 2;
                              return itsSillizium;
                           }                                      
    
                           int Deuterium(int Deuterium, int Arbeiter)
                           {
                               itsDeuterium = Deuterium;
                               itsDeuterium = Arbeiter * 1;
                               return itsDeuterium;    
                           }
    
                           void SetArbeiter(int Arbeiter) 
                           { 
                              itsArbeiter=Arbeiter; 
                           }
    
                           int GetMetal() const { return itsMetall; }
                           int GetSillizium() const { return itsSillizium; }
                           int GetDeuterium() const { return itsDeuterium; }
    
                    private:
    
                            int itsArbeiter;
                            int itsMetall;
                            int itsSillizium;
                            int itsDeuterium;
    };
    
    int main()
    {
          int ersterArbeiter, Arbeiter;
    
          cin >> ersterArbeiter;
          Ressourcen MyRessourcen(ersterArbeiter);
    
          cin >>Arbeiter;
          MyRessourcen.SetArbeiter(Arbeiter);
    
           system("PAUSE");
        return 0;
    }
    


  • Du hast den Konstruktor von Ressourcen ja auch nicht definiert.



  • Braunstein schrieb:

    Du hast den Konstruktor von Ressourcen ja auch nicht definiert.

    lol, jo...
    Hab ich gar nicht drauf geachtet...also der muss so aussehen:

    // in der Klasse unter public:
    Ressourcen (int iArbeiter) { itsArbeiter = iArbeiter; }
    


  • Du hältst wohl nichts von Initialisierungslisten?

    Ressourcen (int iArbeiter) : itsArbeiter(iArbeiter) {}
    


  • Du hältst wohl nichts von Initialisierungslisten?

    Elementinitialisierer heißen die...lol...ne halte ich nicht :p



  • Initialisierungsliste
    ändere deine Meinung lieber. Glaub mir, es ist besser so. 🙂



  • Hm also mein C++ Buch sagt: Elementinitialisierer...aber is summa sumarum auch wuRscht 🤡



  • Vielen dank für die Hilfe!

    Nun läuft das ganze soweit, nur hab ich aus irgendeinem grund einen Pufferüberlauf 😞

    Ich hab jetzt ne ganze weile versucht den fehler zu finden, aber ich kann ihn nirgends entdecken!

    Hätte nicht gedacht das mir wen ich das gelernte mal anwende so viele fehler unterlaufen, wo es doch eigentlich etwas ganz simples ist 😕

    Ressourcen.hpp

    #include <iostream>
    using namespace std;
    
    class Ressourcen
    {
    
                    public:
                           Ressourcen::Ressourcen(int init_Arbeiter){ itsArbeiter=init_Arbeiter; }
                           ~Ressourcen() {};
    
                           int Metall()
                           {
                             int Metall = itsArbeiter;
                             itsMetall = (Metall * 3);
                             return itsMetall;
                           }
    
                           int Sillizium()
                           {
                              int Sillizium = itsArbeiter;
                              itsSillizium = (Sillizium * 2) ;
                              return itsSillizium;
                           }                                      
    
                           int Deuterium()
                           {
                               int Deuterium;
                               Deuterium = itsArbeiter;
                               itsDeuterium  = (Deuterium * 1);
                               return itsDeuterium;    
                           }
    
                           void SetArbeiter(int Arbeiter) 
                           { 
                              itsArbeiter=Arbeiter; 
                           }
    
                           int GetMetall() const { return itsMetall; }
                           int GetSillizium() const { return itsSillizium; }
                           int GetDeuterium() const { return itsDeuterium; }
                           int GetArbeiter() const { return itsArbeiter; }
    
                    private:
    
                            int itsArbeiter;
                            int itsMetall;
                            int itsSillizium;
                            int itsDeuterium;
    };
    

    Ressourcen.cpp

    #include "Ressourcen.hpp"
    
    int main()
    {
    
    int init_Arbeiter;
    
     cout << "Geben sie die Anzahl der Arbeiter ein: ";
     cin >> init_Arbeiter;
     Ressourcen MyRessourcen(init_Arbeiter);
    
         cout << "Ihre Arbeiter erwirtschaften " << MyRessourcen.GetMetall() <<" Metall, ";
         cout << MyRessourcen.GetSillizium() << " Sillizium, und \n" << MyRessourcen.GetDeuterium()<< " Deuterium." << endl;
         cout << "Anzahl der Arbeiter: " << MyRessourcen.GetArbeiter() <<endl;
         system("PAUSE");
        return 0;
    }
    

    P.S

    Der Pufferüberlauf betrifft nur die Ressourcen, itsArbeiter bleibt unverändert bei dem was ich über cin eingebe.



  • Also ersten weiß ich nicht, ob wir unter Pufferüberlauf das gleiche verstehen, und zweitens ist es sinnvoller, da man einen Pufferüberlauf (=Speicherzugriffsverletzung) so sehr schwer erkennen kann, wenn du mit nem Debugger ans Werk gehst...Beschreib mal deinen Fehler genauer 😉

    Wo tritt der Fehler genau auf ?



  • Hehe, ok 😉

    Also der Wertebereich wird überschritten, so wie es aussieht.

    Geben sie die Anzahl der Arbeiter ein: 100
    Ihre Arbeiter erwirtschaften 2008948848 Metall, -1 Sillizium, und
    2009055971 Deuterium.
    Anzahl der Arbeiter: 100
    Drücken Sie eine beliebige Taste . . .

    Ich hab schon nach nem debugger gesucht, aber entweder ich bin blind oder da gibts keinen 😕



  • Ich hab schon nach nem debugger gesucht, aber entweder ich bin blind oder da gibts keinen

    Welchen Compiler hasse denn ?



  • Bloodshed Dev-C++ 🙂



  • Vielleicht solltest du die internen Variablen auch mal initialisieren. In denen steht jetzt nämlich nur Müll drin. Wozu hast du diese anderen Funktionen erzeugt (Deuterium() usw.). Aufrufen tust du sie ja nicht.
    PS. Silizium schreibt man mit einem l.



  • ach mist, ich hab die funktionen im programm code nicht aufgerufen.

    Da rächt es sich das ich so früh angefangen hab was zu versuchen. Dachte doch glatt das das auch so automatisch berechnet wird.

    #include "Ressourcen.hpp"
    
    int main()
    {
    
    int init_Arbeiter;
    
     cout << "Geben sie die Anzahl der Arbeiter ein: ";
     cin >> init_Arbeiter;
     Ressourcen MyRessourcen(init_Arbeiter);
    
        MyRessourcen.Metall();
        MyRessourcen.Deuterium();
        MyRessourcen.Sillizium();
         cout << "Ihre Arbeiter erwirtschaften " << MyRessourcen.GetMetall() <<" Metall, ";
         cout << MyRessourcen.GetSillizium() << " Sillizium, und \n" << MyRessourcen.GetDeuterium()<< " Deuterium." << endl;
         cout << "Anzahl der Arbeiter: " << MyRessourcen.GetArbeiter() <<endl;
         system("PAUSE");
        return 0;
    }
    


  • Warum sollten die automatisch aufgerufen werden. Mein Tipp, schmeiß diese Funktionen raus oder mach sie zumindest private und initialisiere deine Variablen im Konstruktor sowie in SetArbeiter.


Anmelden zum Antworten