Problem mit Code



  • Ab und an hab ich weng Probs mit dem kleinen Programm, indem ich des von der Schule erlernte übe. Ist ziemlich leichtes und banales zeugs wohl für die meisten im Forum

    #include <iostream>
    #include <stdlib.h>
    #include <iomanip>
    #include <fstream>
    #include "basis.h"
    #include "fluessig.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int i;
        char zeile[250]; 
        // fstream damit die Datei zuerst schreibend und dann lesend geöffnet werden kann.
        fstream datei("datei.txt",ios_base::out);
    
        if (datei.good()) {
    
        fluessig artikel(120, 120,121,1);  
        cout.width(65);
        cout << " L A G E R V E R W A L T U N G S P R O G R A M M" << endl;
        for (i=1; i<3; i++) {
            for (i=1; i<=80; i++) 
            cout << "_";
        }
        cout << endl;  
        artikel.getalldaten();
        datei.write((const char*)&artikel, sizeof(artikel));
        datei.close();
    }    
    
        /*ifstream eingabe(ausgabe, ios::in);
        if (eingabe.good()) 
        while (!eingabe.eof()) {
             eingabe.getline(zeile, 250);
             for (int j=0; j<6; j++) {
             cout << endl;
             }
    
        cout << zeile << endl;
        }*/
        fflush(stdin);
        getchar();	
        return 0;
    }
    
    #ifndef _BASIS_
    #define _BASIS_
    
    class basis {
        private:
            double preis, menge;
            char name [40];
            int i, artikelnr;                  //Variable für forschleifen
        public:
            basis();
            basis(double a, double b, int c);
            ~basis();
            void setpreis();
            void setmenge();
            void setname();
            void getalldaten();
            void linie();
            };
    #endif
    
    #include <iostream>
    #include <string>
    #include <iomanip>
    #include "basis.h"
    using namespace std;
    
    //SETMETHODEN  
    void basis::setpreis() {
        cout << "Bitte geben Sie den Preis fuer den Artikel ein: ";
        cin >> preis;
        cout << endl;
         }
    void basis::setmenge() {
        cout << "Bitte geben Sie die vorhandene Lagermenge ein: ";
        cin >> menge;
        cout << endl;
    }  
    
    void basis::setname() {
        cout << "Bitte geben Sie den Artikelnamen ein: ";
        cin >> name;
        cout << endl;
    }      
    //GETMETHODEN
    void basis::getalldaten() {
        cout << "Gesamtdaten des Artikels " << name << ":" << endl << endl
             << "Artikelname             = " << name  << endl
             << "Artikelnummer           = " << artikelnr << endl
             << "Preis des Artikels      = " << preis << " Euro" << endl
             << "Lagermenge des Artikels = " << menge << " Stueck" << endl;
        }    
    
    //KONSTRUKTOREN & DESTRUKTOREN
    basis::basis() {
        preis=0.0;
        menge=0.0;
        artikelnr=0;
    }
    
    basis::basis(double a, double b, int c) {
        preis = a;
        menge = b;  
        artikelnr = c; 
    
    }
    
    basis::~basis() {
    
    }     
    
    //Ausgabemethoden
    
    void basis::linie() { 
        for (i=1; i<3; i++) {
            for (i=1; i<=80; i++) 
            cout << "_";
        }
        cout << endl;    
    }
    
    #ifndef _FLUESSIG_
    #define _FLUESSIG_
    #include "basis.h"
    
    class fluessig : public basis {
        private:
            double liter;
        public:
            fluessig(double a, double b, int c, double d);
            void setliter();
            void getliter();
            void getalldaten();
            };
    #endif
    
    #include "fluessig.h"
    #include <iostream>
    using namespace std;
    
    void fluessig::setliter() {
        cout << "Bitte geben Sie die Liter des Produktes an: ";
        cin  >>liter;
    }
    
    void fluessig::getliter() {
        cout << "Volumen des Artikels    = " << liter << " Liter" << endl;
    }   
    
    fluessig::fluessig(double a, double b, int c, double d) : basis(a, b, c) { 
        liter=d;
    
    } 
    
    void fluessig::getalldaten() {
         cout << "Bereich Fluessigkeitslager" << endl << endl;
         basis::getalldaten();
         fluessig::getliter();
         basis::linie();    
    }
    

    Wenn ich das Programm jetzt ausführe. Dann wird mir für die variable ne kombination verschiedener Sonderzeichen ausgegeben, und ich weiss net warum. Warum ist das nicht so
    das, das Feld einfach leer bleibt?

    Und warum speichert er das ausgegeben nicht normal in eine textfile? ich bekomme da auch nur alle möglichen Sonderzeichen.



  • Ich weiß nicht worin genau dein Problem liegt. Von welcher Variable sprichst du?



  • hast du das Programm mal ausgeführt? Wenn ja hast du keine komischen sonderzeichen für die variable "name" wenn sie ausgegeben wird?



  • Hab es nicht ausprobiert, aber definier "name" mal nicht als char-array sondern als string und inkludiere einfach in fluessig.cpp auch basis.h.



  • Ist doch klar.
    Frage: wann rufst du denn artikel.setname("irgendwas") auf?
    Das Programm druckt dir für Name irgendwas aus dem Speicher aus. Du hast die Membervariable "name" nie mit irgendetwas initialisiert. Nicht im Konstruktor und auch nicht später mit setname().

    Zudem, der Konstruktor von basis ist falsch geschrieben!

    basis::basis() { 
        preis=0.0; 
        menge=0.0; 
        artikelnr=0; 
    }
    

    Ein Konstruktor sollte ALLE Klassenmember initialisieren, er tut es aber nur für preis, menge und artikelnr. Sollte wenigstens ein "" in dem Namen schreiben und der name sollte als Parameter des Konstruktors erscheinen. Vielleicht sogar mit einem Default-Wert.
    Und noch was: versuch statt char* und char[] lieber string zu verwenden. Ist wesentlich einfacher und eleganter.

    class basis { 
        private: 
            double preis, menge; 
            [b]string name; [/b] 
            int i, artikelnr;                  //Variable für forschleifen 
        public: 
            basis(); 
            basis(double a, double b, int c); 
            ~basis(); 
            void setpreis(); 
            void setmenge(); 
            void setname(); 
            void getalldaten(); 
            void linie(); 
            }; 
    #endif
    

    und dann in der basis.cpp

    .....
    //KONSTRUKTOREN & DESTRUKTOREN 
    basis::basis([b]const string _name=""):
    name(_name) [/b]
    //hier wird der interne "name" mit dem Parameter "_name" initialisiert
    { 
        preis=0.0; 
        menge=0.0; 
        artikelnr=0; 
    }
    ....
    

    Gruß,
    Nik0n



  • Referenzen nutzen, ansonsten ist das const Unsinn
    [cpp]//KONSTRUKTOREN & DESTRUKTOREN
    basis::basis(const string**&** _name=""):
    name(_name)[/cpp]



  • vielen dank für eure Lösungen. Hat mir sehr geholfen.


Anmelden zum Antworten