[gelöst]Frage zu meinem Adressbuch



  • Hey Leute,
    habe folgendes Programm geschrieben, ist ein Adressbuch:

    main.cpp

    #include "classAdressbuch.cpp"
    
    int main()
    {
        const int maxSize=40;
        int i=0;
        for(bool exit=false;exit==false;)
            {
                cout<<"Wollen sie eine Adresse speichern(1)oder nicht(2)?";
                int choice;
                cin>>choice;
                bool exit2;
                if(choice==2)
                    {
                        exit2=true;
                    }
                Adressbuch *pZeiger[maxSize];
                for(;exit2==true;)
                    {
                        cout<<"Wollen sie Adressen auslesen(1) oder beenden(2)?";
                        int choice;
                        cin>>choice;
                        if(choice==2)
                            {
                                exit=true;
                                break;
                            }
                        cout<<"Welche Adresse wollen sie auslesen: ";
                        int j;
                        cin>>j;
                        cout<<pZeiger[j]->getVor_name()<<"\n";
                        cout<<pZeiger[j]->getNach_name()<<"\n";
                        cout<<pZeiger[j]->getAdresse()<<"\n";
                        cout<<pZeiger[j]->getTele()<<"\n";
                    }
                if(exit==true)
                    {
                        break;
                    }
                cout<<"Geben sie den Vornamen ein: ";
                string vor_name;
                cin>>vor_name;
                cout<<"Geben sie den Nachname ein: ";
                string nach_name;
                cin>>nach_name;
                cout<<"Geben sie die Adresse ein: ";
                char *pArray=new char[maxSize];
                cin.ignore();
                cin.getline(pArray,maxSize);
                cout<<"Geben sie die Telefonnummer ein: ";
                int tele;
                cin>>tele;
                pZeiger[i]=new Adressbuch;
                pZeiger[i]->setVor_name(vor_name);
                pZeiger[i]->setNach_name(nach_name);
                pZeiger[i]->setAdresse(pArray);
                pZeiger[i]->setTele(tele);
                i++;
                if(exit==false)
                    {
                        delete[] pZeiger;
                        delete[] pArray;
                    }
            }
        return 0;
    }
    

    classAdressbuch.h

    #ifndef CLASSADRESSBUCH_H_INCLUDED
    #define CLASSADRESSBUCH_H_INCLUDED
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    class Adressbuch
    {
        public:
            Adressbuch(){}
            Adressbuch(string vor_name, string nach_name, char *pArray, int tele):
            itsVor_name(vor_name), itsNach_name(nach_name), itsAdresse(pArray), itsTele(tele){}
            ~Adressbuch(){}
            void setVor_name(string);
            void setNach_name(string);
            void setAdresse(char*);
            void setTele(int);
            string getVor_name()const{return itsVor_name;}
            string getNach_name()const{return itsNach_name;}
            string getAdresse()const{return itsAdresse;}
            int getTele()const{return itsTele;}
        private:
            string itsVor_name;
            string itsNach_name;
            string itsAdresse;
            int itsTele;
    };
    
    #endif // CLASSADRESSBUCH_H_INCLUDED
    

    classAdressbuch.cpp

    #include "classAdressbuch.h"
    
    void Adressbuch::setVor_name(string vor_name)
    {
        itsVor_name=vor_name;
    }
    
    void Adressbuch::setNach_name(string nach_name)
    {
        itsNach_name=nach_name;
    }
    
    void Adressbuch::setAdresse(char* pArray)
    {
        itsAdresse=pArray;
    }
    
    void Adressbuch::setTele(int tele)
    {
        itsTele=tele;
    }
    

    Es funktioniert alles, er bringt auch keinen Compiler-Fehler, nur eine Warnung:
    deleting array Adressbuch *pZeiger[40]

    So wollte euch mal fragen was man an dem Programm also im Code noch verbessern könnte oder vereinfachen.
    Damit ich es beim nächsten mal besser weiß=)
    Danke schonmal:-P 🙂



  • vieleicht nimmst du einfach dein delete[] parray raus? und siehst ob er einverstanden ist?


  • Mod

    Wichtige Verbesserungen:

    - Man benutzt include nicht mit cpp-Dateien. Mach dich mal damit vertraut wie das mit den Headern und dem Linker richtig geht.
    - Du hantierst selber mit Zeigern, new und delete. Verwende doch lieber STL-Container.
    - Wie du 'for' benutzt ist ziemlich ungwöhnlich. Du solltest dir mal while und do Schleifen angucken
    - Wenn du keine sinnvolle Definition für den Destruktor und den Standardkonstruktor hast, dann lass sie doch weg!
    -Warum nutzt du manchmal string und manchmal char[]? Benutz immer string!
    -'using namespace std' sollte man nie in Headern machen.

    Kleinigkeiten:
    - Telefonnummern sind keine Zahlen, sondern Sequenzen von Ziffern. Alles was Zahlen von Strings unterscheidet (man kann mit Zahlen rechnen), macht bei Telefonnummern keinen Sinn. Außerdem können integer nicht mit 0 beginnen, was aber fast alle Telefonnummern tun.
    - Dein Programmablauf sieht falsch aus. Sicher, dass alles funktioniert wie es soll? Ich meine da insbesondere die Abbruchbedingungen. Kann aber auch sein, das ich es gerade nicht richtig durchschaue. Was aber auch ein schlechtes Zeichen ist, wenn es nicht offensichtlich durchschaubar ist.

    Erweiterungsmöglichkeiten:
    - Bisher macht deine Klasse nichts anderes als ein reiner struct mit 4 Datenmembern. Wie wäre es mit ein paar Methoden die etwas sinnvolles mit der Adresse machen? Ein anfang wäre zum Beispiel eine formatierte Ausgabe der ganzen Adresse (über Operator <<)



  • Kriegen die Schüler momentan immer schlechtere Lehrer oder warum sehen die Codes der Neuen hier immer mehr und mehr "Scheiße" aus?
    Erstmal, du hast doch sicherlich genug Platz in deiner IDE, also nimm dir diesen Platz und klatsch nicht alles aneinander, da kriegt man doch Klaustrophobie.

    cout<<"Hallo";
    //z.B. in
    cout << "Hallo";
    

    Die Leertaste ist dafür da, damit man sie nutzt.

    for(;exit2==true;)
    

    Du benutzt eine for-Schleife, nur damit du eine Bedingungen abfragen kannst? while-Schleifen kennst du wohl nicht.

    Adressbuch *pZeiger[maxSize];
    

    maxSize entspricht 40, ich sehe nirgendswo eine Abfrage, in der du prüfst ob schon 40 Elemente enthalten sind. D.h., selbst beim 41. Element, würde dein Programm noch zulassen, dass ich eine Eingabe mache und es versucht dies abzuspeichern.
    Wenn ich das mit meinen müden und verschlafenen Augen gerade richtig sehe, dann löschst du alle Elemente in jeder Ausführung der Schleife.

    for(bool exit=false;exit==false;)
    

    exit entspricht false, gehen wir davon aus ich will eine Adresse speichern, dann komm ich zum Vornamen etc. Nachdem du dann den Mist abgespeichert hast, löschst du einfach das komplette Ding wieder.
    Und wie wärs eig., wenn du

    int i=0;
    for(bool exit=false;exit==false;)
    

    durch

    bool exit = false;
    for(int i = 0; !exit; i++)
    

    ersetzt. Dann hast du dir das "i++" ersparrt. Das ist sowieso üblicher. Deine for-Schleife wird so eig. nie gesehen.
    Außerdem frage ich mich warum du mit char Pointer rumhantierst. Es gibt soviel besseres und mehr Möglichkeiten, als mit so nem Kram sich zu beschäftigen.

    Naja meine Meinung, ob du die Tipps annimmst ist dein Ding.

    Freaky



  • Danke erstmal=)
    Ich probiere jetzt mal eure Tipps und Meinungen umzusetzen.
    Wenn ich wo nicht weiterkomme frag ich euch natürlich nochmal.
    Die erste Frage gleich mal: Ich sollte ja immer string benutzen, wollte ich auch, jedoch hatte ich da Probleme bei der Adresse, cin.getline hat bei mir nie einen string akzeptiert, mit dem char array gings dann....


  • Mod

    fr33g schrieb:

    Danke erstmal=)
    Ich probiere jetzt mal eure Tipps und Meinungen umzusetzen.
    Wenn ich wo nicht weiterkomme frag ich euch natürlich nochmal.
    Die erste Frage gleich mal: Ich sollte ja immer string benutzen, wollte ich auch, jedoch hatte ich da Probleme bei der Adresse, cin.getline hat bei mir nie einen string akzeptiert, mit dem char array gings dann....

    Versuchs mal hiermit:
    http://www.cplusplus.com/reference/string/getline/



  • ok danke.
    also wie ich das löse soll mit dem inkludieren leuchtet mit leider noch nicht so ganz ein.ich hab jetzt in der main.cpp nur die headerdatei inkludiert sonst nichts. in der classAdressbuch.cpp auch nur die headerdatei.
    und in der header selber steht usingnamespace std und dei inkludierung von iostream und string.
    beim compilen kommt leider trotzdem ein fehler:(


  • Mod

    Da exit bereits eine Funktion ist, ist es möglicherweise keine besonders gute Wahl für den Namen einer Variable.



  • wäre lieb wenn mir einer dass mit dem includen und linken erklären könnte, hab jetzt mal gegoogelt.
    also ich soll in die main.cpp
    string und iostream inkluden, sowie classAdressbuch.h
    zusätzlich using namespace std; schreiben.
    in der header datei hab ich nix inkludiert, und in der classAdressbuch.cpp nur die header.
    aber ich bekomme einen haufen an fehlermeldungen:(



  • also wie heißt es Wikipedia ist dein Freund http://de.wikipedia.org/wiki/Linker_%28Computerprogramm%29

    Du solltst die Klassen/Headerdatein immer dort inkluden wo du diese benötigst.
    Wenn du welche in deiner main.cpp braucht z.B string dann bindest du dieses auch dort ein, wenn du eine Klasse (string) in classAdressbuch.h benötigst bindest du diese dort auch ein!!! Du inkludest immer (nur) die Klassen/Headerdatein die du gerade benötigst. So macht es (meistens) keinen Sinn cmath oder iostream in Headerdatein zu inkluden, da du Deklaration (.h) und Definition (.cpp) in zwei unterschiedliche Datein aufteilen sollst.
    Zu using namespace std
    Was SeppJ damit meint ist, dass du in deiner Header nicht using namespace std; verwenden sollst sondern std:: und danach die Klasse ala string (std::string). In deiner cpp Datei kannst du dann dein using namespace std; schreiben.



  • Wahrscheinlich Linkerfehler: "undefined function ..."?
    Du mußt alle Source-Dateien (.cpp) zu deinem Projekt hinzufügen.



  • Also so sieht es jetzt aus, habe alles verbessert was ihr gesagt hab, bis auf dass ich nicht weiß was ein STL-Container sein soll.Der Programmablauf stimmt auf jeden Fall und es funktioniert auch alles.Außer halt dass er noch den Fehler bringt der unten steht.

    main.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        const int maxSize = 40;
        bool stop = false;
        bool stop2 = false;
        for (int i=0; i<40; i++)
            {
                cout << "Wollen sie eine Adresse speichern(1)oder nicht(2)?";
                int choice;
                cin >> choice;
                if (choice == 2)
                    {
                        stop = true;
                    }
                Adressbuch *pZeiger[maxSize];
                while (stop == true)
                    {
                        cout << "Wollen sie Adressen auslesen(1) oder beenden(2)?";
                        int choice;
                        cin >> choice;
                        if (choice == 2)
                            {
                                stop2 = true;
                                break;
                            }
                        cout << "Welche Adresse wollen sie auslesen: ";
                        int j;
                        cin >> j;
                        cout << pZeiger[j]->getVor_name() << "\n";
                        cout << pZeiger[j]->getNach_name() << "\n";
                        cout << pZeiger[j]->getAdresse() << "\n";
                        cout << pZeiger[j]->getTele() << "\n";
                    }
                if (stop2 == true)
                    {
                        break;
                    }
                cout << "Geben sie den Vornamen ein: ";
                string vor_name;
                cin >> vor_name;
                cout << "Geben sie den Nachname ein: ";
                string nach_name;
                cin >> nach_name;
                cout << "Geben sie die Adresse ein: ";
                string adresse;
                cin.ignore();
                getline(cin,adresse);
                cout << "Geben sie die Telefonnummer ein: ";
                string tele;
                cin >> tele;
                pZeiger[i] = new Adressbuch;
                pZeiger[i]->setVor_name(vor_name);
                pZeiger[i]->setNach_name(nach_name);
                pZeiger[i]->setAdresse(adresse);
                pZeiger[i]->setTele(tele);
            }
        return 0;
    }
    

    classAdressbuch.h

    #include <iostream>
    #include <string>
    
    #ifndef CLASSADRESSBUCH_H_INCLUDED
    #define CLASSADRESSBUCH_H_INCLUDED
    
    class Adressbuch
    {
        public:
            void setVor_name(std::string);
            void setNach_name(std::string);
            void setAdresse(std::string);
            void setTele(std::string);
            std::string getVor_name()const{return itsVor_name;}
            std::string getNach_name()const{return itsNach_name;}
            std::string getAdresse()const{return itsAdresse;}
            std::string getTele()const{return itsTele;}
        private:
            std::string itsVor_name;
            std::string itsNach_name;
            std::string itsAdresse;
            std::string itsTele;
    };
    
    #endif // CLASSADRESSBUCH_H_INCLUDED
    

    classAdressbuch.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    void Adressbuch::setVor_name(string vor_name)
    {
        itsVor_name=vor_name;
    }
    
    void Adressbuch::setNach_name(string nach_name)
    {
        itsNach_name=nach_name;
    }
    
    void Adressbuch::setAdresse(string adresse)
    {
        itsAdresse=adresse;
    }
    
    void Adressbuch::setTele(string tele)
    {
        itsTele=tele;
    }
    

    aber er bringt den fehler undefinded reference to Adressbuch::setVor_Name....
    Der fehler bringt er für die ganzen funktionen die eben in der classAdressbuch.cpp sind.
    Also ich habe alle 3 dateien in meinem projekt drinnen.arbeite mit codeblocks.

    Danke schonmal:-)

    EDIT: So hat jetzt alles geklappt, musste nur bei den build optionen der datei classAdressbuch.cpp n haken dazu machen 🙄

    Also es funktioniert jetzt alles.
    Hab auch alles geändert bis auf das mit dem STL. Weiß leider nicht was das ist, ich google mal:-P
    Sonst is der code jetzt auch schon besser oder?




  • Administrator

    STL Container, bzw. Standardbibliothek Container:
    http://www.cplusplus.com/reference/stl/

    Zum Code:
    ... Naja ...

    Nur grob ein paar Dinge:
    - Gib ihm mehr Platz, füge Leerzeichen/Leerzeilen ein. Ein Code der atmet, ist auch gut lesbar.
    - Ein Adressbuch ist für mich irgendwie nicht das Gleiche wie eine Adresse. Ich würde somit die Klasse umbenennen. Dieser Name macht keinen Sinn.
    - Was passiert bei fehlerhaften Eingaben? Fehlerbehandlung fehlt völlig.
    - Was ist, wenn man mehrere Vornamen oder Nachnamen hat? Ich würde die Vornamen und Nachnamen auch per std::getline einlesen.
    - Mehrzeilige Adressen?
    - Handy? Fax? Geschäft Tel? 🙂

    Und gäbe noch anderes zum kritisieren. Aber ist natürlich auch ein wenig fragwürdig, wie weit ins Detail man bei einem Anfänger gehen soll 🙂

    Grüssli



  • Ok danke schonmal 🙂
    ja ich gut da werd ich dann mal probieren dass noch ein bisschen verbessern.
    ja klar fehlerbehandlung und so muss auch noch rein. wollt erst mal son kleines grundgerüst was funktioniert.
    hab den code jetzt noch so erweitert dass man beim auslesen den namen den man sucht eingibt:

    main.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        const int maxSize = 40;
        bool stop = false;
        bool stop2 = false;
        for (int i=0; i<40; i++)
            {
                cout << "Wollen sie eine Adresse speichern(1)oder nicht(2)?";
                int choice;
                cin >> choice;
                if (choice == 2)
                    {
                        stop = true;
                    }
                Adressbuch *pZeiger[maxSize];
                while (stop == true)
                    {
                        cout << "Wollen sie Adressen auslesen(1) oder beenden(2)?";
                        int choice;
                        cin >> choice;
                        if (choice == 2)
                            {
                                stop2 = true;
                                break;
                            }
                        cout << "Welche Adresse wollen sie auslesen(Vorname): ";
                        string temp;
                        cin >> temp;
                        bool right;
                        for(int j=0;j<i;j++)
                            {
                                right = false;
                                if(pZeiger[j]->compareString(temp))
                                    {
                                        cout << pZeiger[j]->getVor_name() << "\n";
                                        cout << pZeiger[j]->getNach_name() << "\n";
                                        cout << pZeiger[j]->getAdresse() << "\n";
                                        cout << pZeiger[j]->getTele() << "\n";
                                        right = true;
                                        break;
                                    }
                            }
                            if(right == false)
                            {
                                cout << "Keine Übereinstimmung!\n";
                            }
                    }
                if (stop2 == true)
                    {
                        break;
                    }
                cout << "Geben sie den Vornamen ein: ";
                string vor_name;
                cin >> vor_name;
    
                cout << "Geben sie den Nachname ein: ";
                string nach_name;
                cin >> nach_name;
                cout << "Geben sie die Adresse ein: ";
                string adresse;
                cin.ignore();
                getline(cin,adresse);
                cout << "Geben sie die Telefonnummer ein: ";
                string tele;
                cin >> tele;
                pZeiger[i] = new Adressbuch;
                pZeiger[i]->setVor_name(vor_name);
                pZeiger[i]->setNach_name(nach_name);
                pZeiger[i]->setAdresse(adresse);
                pZeiger[i]->setTele(tele);
            }
        return 0;
    }
    

    classAdressbuch.h

    #include <iostream>
    #include <string>
    
    #ifndef CLASSADRESSBUCH_H_INCLUDED
    #define CLASSADRESSBUCH_H_INCLUDED
    
    class Adressbuch
    {
        public:
            void setVor_name(std::string);
            void setNach_name(std::string);
            void setAdresse(std::string);
            void setTele(std::string);
            std::string getVor_name()const{return itsVor_name;}
            std::string getNach_name()const{return itsNach_name;}
            std::string getAdresse()const{return itsAdresse;}
            std::string getTele()const{return itsTele;}
            bool compareString(std::string&)const;
        private:
            std::string itsVor_name;
            std::string itsNach_name;
            std::string itsAdresse;
            std::string itsTele;
    };
    
    #endif // CLASSADRESSBUCH_H_INCLUDED
    

    classAdressbuch.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    void Adressbuch::setVor_name(string vor_name)
    {
        itsVor_name=vor_name;
    }
    
    void Adressbuch::setNach_name(string nach_name)
    {
        itsNach_name=nach_name;
    }
    
    void Adressbuch::setAdresse(string adresse)
    {
        itsAdresse=adresse;
    }
    
    void Adressbuch::setTele(string tele)
    {
        itsTele=tele;
    }
    bool Adressbuch::compareString(string &temp)const
    {
        if(itsVor_name==temp)
            return true;
    }
    

    werd dann mal noch n paar sachen erweitern und einbauen, falls ihr noch tipps hat könnt ihr sie gerne schreiben;-)
    dass mit den stl werd ich mir au mal durchlesen;-)



  • Der Code gefällt mir so nicht. Ich persönlich würde ihn so "gestalten".

    main.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    //#include <string> brauchst du nicht, vorallem nicht bei Code::Blocks
    
    using namespace std; //gewöhns dir ab
    
    int main()
    {
        const int maxSize = 40;
        int choice;
        bool stop = false;
        bool stop2 = false;
        bool right = false;
        Adressbuch *pZeiger[maxSize];
        string vorname;
    
        for(int i = 0; i < 40; i++) 
        {
            cout << "Wollen sie eine Adresse speichern(1)oder nicht(2)?";
            cin >> choice;
    
            if (choice == 2)
                stop = true;
    
            while(stop)
            {
                cout << "Wollen sie Adressen auslesen(1) oder beenden(2)?";
                cin >> choice;
    
                if (choice == 2)
                {
                    stop2 = true;
                    break;
                }
    
                cout << "Welche Adresse wollen sie auslesen(Vorname): ";
                cin >> vorname;
    
                for(int j = 0; j < i; j++)
                {
                    right = false;
                    if(pZeiger[j]->compareString(vorname))
                    {
                        cout << pZeiger[j]->getVor_name() << "\n";
                        cout << pZeiger[j]->getNach_name() << "\n";
                        cout << pZeiger[j]->getAdresse() << "\n";
                        cout << pZeiger[j]->getTele() << "\n";
                        right = true;
                        break;
                    }
                }
                if(!right)
                    cout << "Keine Übereinstimmung!\n";
            }
            if(stop2)
                break;
    
            cout << "Geben sie den Vornamen ein: ";
            string vor_name;
            cin >> vor_name;
    
            cout << "Geben sie den Nachname ein: ";
            string nach_name;
            cin >> nach_name;
            cout << "Geben sie die Adresse ein: ";
            string adresse;
            cin.ignore();
            getline(cin,adresse);
            cout << "Geben sie die Telefonnummer ein: ";
            string tele;
            cin >> tele;
            pZeiger[i] = new Adressbuch;
            pZeiger[i]->setVor_name(vor_name);
            pZeiger[i]->setNach_name(nach_name);
            pZeiger[i]->setAdresse(adresse);
            pZeiger[i]->setTele(tele);
        }
        //return 0; brauchst du nicht
    }
    

    classAdressbuch.h

    //#include <iostream> brauchst du nicht, oder benutzt du den in & out stream? ich sehe keine Eingaben/Ausgaben
    //#include <string> brauchst du nicht
    
    #ifndef CLASSADRESSBUCH_H_INCLUDED
    #define CLASSADRESSBUCH_H_INCLUDED
    
    class Adressbuch
    {
        public:
            void setVor_name(std::string);
            void setNach_name(std::string);
            void setAdresse(std::string);
            void setTele(std::string);
            std::string getVor_name() const { return itsVor_name; }
            std::string getNach_name() const { return itsNach_name; }
            std::string getAdresse() const { return itsAdresse; }
            std::string getTele() const { return itsTele; }
            bool compareString(std::string&) const;
        private:
            std::string itsVor_name;
            std::string itsNach_name;
            std::string itsAdresse;
            std::string itsTele;
    };
    
    #endif // CLASSADRESSBUCH_H_INCLUDED
    

    classAdressbuch.cpp

    #include "classAdressbuch.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    void Adressbuch::setVor_name(string vor_name)
    {
        itsVor_name = vor_name;
    }
    
    void Adressbuch::setNach_name(string nach_name)
    {
        itsNach_name = nach_name;
    }
    
    void Adressbuch::setAdresse(string adresse)
    {
        itsAdresse = adresse;
    }
    
    void Adressbuch::setTele(string tele)
    {
        itsTele = tele;
    }
    bool Adressbuch::compareString(string &temp)const
    {
        if(itsVor_name == temp)
            return true;
    }
    

    So ungefähr halt, hab jetzt mal eben drüber.
    Außerdem frage ich mich, warum du immer sowas hier machst

    if(...)
        {
            ...
        }
    //zu
    if(...)
    {
        ...
    }
    

    Mach doch die Klammer genau unter das if.
    Irgendwann kommt bestimmt mal der Zeitpunkt, in dem du verschachtelte if-Anweisungen oder Schleifen hast.
    Bei dir müsste man dann irgendwann schon nach rechts scrollen und das ist ziemlich hässlig.
    Aufjedenfall hat dein Programm immer noch den Fehler, dass es mehr als 40 Einträge zulässt.



  • ok danke.
    werd ich mir merken und ändern, vor allem noch fehlerbehandlung.
    aber mal ne frage wenn ich des using namespace std weglasse.
    wo muss dann überall des std:: dazu?
    und was ich auch noch wissen wollt gibts eg n unterschied zwischen:
    cout << "bla\n"; und
    cout << "bla" << endl;
    ???

    EDIT:
    Habs jettz so geändert wie du mirs gezeigt hast, doch er bringt mir bei der header datei lauter fehler wegen dem string???
    mach ich im header <string> rein funktionierts...


  • Mod

    FreakY<3Cpp ist da etwas übereifrig. using namespace in cpp-Dateien ist gar kein Problem. Ungünstig wird es erst, wenn du sie im Header verwendest. Ein gutes Beispiel ist dein eigenes Programm: Du hattest (in deiner ersten Version) eine Variable namens exit. Kein Problem. Es gibt in dem Header cstdlib aber auch eine Funktion std::exit. Du hättest so auch ohne Probleme cstdlib einbinden können, denn std::exit und exit sind ja zwei verschiedene Sachen. Hättest du aber in irgendeinem Header den du eingebunden hättest 'using namespace std' stehen gehabt, wären alle Sachen aus dem std-Namespace in den unbenannten Namespace gebracht worden und du hättest eine doppelte Definition von exit gehabt. Wenn jetzt jemand anderes diesen Header geschrieben hätte und du ihn nur benutzt und in diesem Header stünde ein "using namespace", dann hättest du keine Möglichkeit dieses wegzubekommen und hättest dein ganzes Programm umschreiben müssen, bloß weil jemand "using namespace" in einem Header verwendet hat. Deshalb gilt es als sehr schlechter Stil, dies zu tun.

    Da cpp-Dateien normalerweise nirgendwo inkludiert werden, kann man "using namespace" dort benutzen wie man will.

    Und warum du den Tipp bekommen hast, string nicht einzubinden, kapier ich nicht. Binde immer ALLE Header ein die du brauchst. Verlasse dich NIE darauf, dass ein bestimmter Header durch einen anderen Header schon eingebunden wird.

    Der Unterschied zwischen endl und \n ist, dass endl diesem entspricht:

    <<'\n'<<std::flush
    

    Das ist ein kleiner aber feiner Unterschied.



  • ok, jetzt mal ne kurze frage, was genau mach using namespace std;?
    was muss ich denn dann ändern falls ich es mal weglasse in einem header? also wo muss std:: überall davor?



  • Ich muss string nie inkludieren, dass ist eigentlich standard.
    Wegen dem Namespace, ich meinte nicht das es schlecht ist, nur das er es sich vielleicht abgewöhnen kann. Am Anfang hatte ich auch noch mit using namespace std rumhantiert, hatte es mir dann aber abgewöhnt und immer std:: vor allem geschrieben. Die 5 Zeichen sind jetzt auch nicht der Untergang.
    Wo du std:: davor schreiben musst, wird dir dein Compiler schon sagen.



  • FreakY<3Cpp schrieb:

    //#include <string> brauchst du nicht, vorallem nicht bei Code::Blocks

    Versteh ich nicht.
    Warum sollte man die Header nicht includen, die man braucht?! Und was hat das alles mit der IDE zu tun?!


Anmelden zum Antworten