Klasse für Personen??



  • Also ich hab das jetzt mal so gemacht einfach zum Testen.

    [cpp]
    #include <iostream>
    
    class Person {
    	public:
    		Person(char vorname);
    		~Person();
    		char getDaten();
    		void datenAusgeben();	
    	private:
    		char itsVorname;
    
    };
    
    //Konstruktor
    Person::Person(char vorname) {
    	itsVorname = vorname;
    }
    
    //Dekonstrukor
    Person::~Person() {
    }
    
    //Methode Datenausgeben
    char Person::getDaten() {
    	return itsVorname;
    }
    
    void Person::datenAusgeben() {
    	std::cout <<"Das ist ein Test.\n";
    }
    
    int main() {
    	char vorname;
    	std::cout << "Geben Sie die Personalien ein:\n";
    
    	std::cout << "Vorname: ";
    	std::cin >> vorname; 
    
    	Person Mike(vorname);
    	std::cout << Mike.getDaten() << " ist die erste Person.\n";
    	Mike.datenAusgeben();
    	system("PAUSE");
    }
    [/cpp]
    

    Lässt sich compilieren, aber wenn ich jetzt den Namen eingebe, dann gibt er immer nur den ersten Buchstaben also M aus.

    Gibt es andere Möglichkeiten, außer die mit den Zeigern? So weit bin ich nämlich noch nicht. 🙄 Hab erst vor Kurzem angefangen.

    Danke!



  • nimm einfach std::string
    und es gibt einen kleinen unterschied zwischnen char x und char * x,
    der auch erklärt warum du nur ein zeichen erhälts
    ich sag nur, wer gleich string benutzt ärgert sich später nicht darüber das ihm gewisse funktionen fehlen wenn er mit strings arbeiten will



  • Platy schrieb:

    Am besten du nimmst char-Arrays, also:

    char* Name = new char[30]  //bei der Länge lass dir einen guten Wert einfallen...
    

    So brauchst du später auch nur die Zeiger an die Funktionen übergeben.

    Wasn das für ein "toller" Ratschlag. 🙄 Schon mal was von Referenz-Parametern gehört.

    In einem anderen Beitrag habe ich std::string empfohlen bekommen, aber das geht bei mir irgendwie nicht.

    Da machst du wohl irgendwas falsch. Aber mit dieser "Fehlermeldung" kannst du
    leider nicht auf Unterstützung hoffen, da müsstest du dein Problem schon etwas
    mehr, etwas genauer erläutern.



  • Also wenn ich das mit std::string mache, geht es nicht. Denke mal ich setzte das std::string falsch. 😞

    [cpp]
    #include <iostream>
    
    class Person {
    	public:
    		Person(std::string vorname);
    		~Person();
    		std::string getDaten();
    		void datenAusgeben();	
    	private:
    		std::string itsVorname;
    
    };
    
    //Konstruktor
    Person::Person(std::string vorname) {
    	itsVorname = vorname;
    }
    
    //Dekonstrukor
    Person::~Person() {
    }
    
    //Methode Datenausgeben
    std::string Person::getDaten() {
    	return itsVorname;
    }
    
    void Person::datenAusgeben() {
    	std::cout <<"Das ist ein Test.\n";
    }
    
    int main() {
    	std::string vorname;
    	std::cout << "Geben Sie die Personalien ein:\n";
    
    	std::cout << "Vorname: ";
    	std::cin >> vorname; 
    
    	Person Mike(vorname);
    	std::cout << Mike.getDaten() << " ist die erste Person.\n";
    	Mike.datenAusgeben();
    	system("PAUSE");
    }
    [/cpp]
    

    Wahrscheinlich hab ich wieder totalen Blödsinn gemacht 😉 !

    Muss mir wohl dann mal das Kapitel über Zeiger vornehmen, wenn es keine andere Lösung gibt.


  • Mod

    timkon schrieb:

    Also wenn ich das mit std::string mache, geht es nicht.

    dein compiler sagt also: geht nicht?

    timkon schrieb:

    Muss mir wohl dann mal das Kapitel über Zeiger vornehmen, wenn es keine andere Lösung gibt.

    du willst den fehler also nicht finden und beseitigen?



  • timkon schrieb:

    Also wenn ich das mit std::string mache, geht es nicht

    WAS GEHT DENN NICHT. Compiler, Linker, Runtime, Fehlermeldung usw. 🙄

    Es kann nie schaden wenn

    #include <string>
    

    einbindet wenn man strings verwenden



  • also wenn ich #include <string> mache geht es.

    Danke erstmal!



  • Hab zwar kein VC2005 zur Hand. Ich nehme trotzdem an das

    #include <string>
    

    dein Problem löst.



  • Wenn du gerade am Ändern bist, dann mach bitte aus

    Person::Person(std::string vorname) {
        itsVorname = vorname;
    }
    

    folgendes

    Person::Person(std::string& vorname) {
        itsVorname = vorname;
    }
    

    😉



  • was erreiche ich damit?



  • kann man mit return auch 2 Variablen zurück liefern lassen?

    Oder geht er nach 1 ner automatisch aus der Funktion?

    [cpp]
    //zB
    return var1, var2;
    [/cpp]
    

    Meine ma gelesen zu haben, dass es funktioniert, kann mich aber täusche. Ich weiß, dass nach dem return die Funktion verlassen wird. 🙂



  • Du erreichst damit, das bei Übergabe des strings an den Konstruktor keine
    Kopie erstellt wird sondern stattdessen eine Referenz auf deinen "vornamen"
    übergeben wird. Das ist, wie dir sicher einleuchten wird, effizienter.

    Damit der Konstruktor diesen Wert auch nicht unbeabsichtigt ändert kann man dann
    gleich

    Person::Person(const std::string& vorname) {
        itsVorname = vorname;
    }
    

    verwenden. 😉



  • timkon schrieb:

    kann man mit return auch 2 Variablen zurück liefern lassen?

    Oder geht er nach 1 ner automatisch aus der Funktion?

    [cpp]
    //zB
    return var1, var2;
    [/cpp]
    

    Meine ma gelesen zu haben, dass es funktioniert, kann mich aber täusche. Ich weiß, dass nach dem return die Funktion verlassen wird. 🙂

    Du kannst eine struct/class zurückliefern die dann natürlich aus mehreren
    Teilen/Variablen "bestehen" kann.
    Alternativ du kannst natürlich auch out-Parameter in deiner Funktionsdefinition
    verwenden.

    Du solltest vielleicht mal die Konsultation eines Lehrbuchs in Betracht ziehen.



  • Hab ein Lehrbuch, aber manchmal ist es irgendwie so, dass ich, wenn ich grad etwas schreibe was brauche, was ich noch nicht kenne oder so...

    Wie könnte dann der VOrschlag von dir aussehen?

    Danke!



  • Platy schrieb:

    Am besten du nimmst char-Arrays, also:

    char* Name = new char[30]  //bei der Länge lass dir einen guten Wert einfallen...
    

    So brauchst du später auch nur die Zeiger an die Funktionen übergeben.

    Oh Gott, das währe so das übelste was man in dem Fall in C++ machen kann. Dann kannst du auch gleich reines C nehmen.



  • timkon schrieb:

    Wie könnte dann der VOrschlag von dir aussehen?

    Z.b. so:

    #include <iostream>
    #include <string>
    
    std::pair<std::string, std::string> Foo()
    {
        return std::make_pair("Hallo!", "Tschuess");
    }
    
    int main()
    {
        std::pair<std::string, std::string> Ergebnis = Foo();
        std::cout << Ergebnis.first << std::endl << Ergebnis.second;
    }
    

    oder so:

    #include <iostream>
    #include <string>
    
    struct StringPair
    {
        std::string first;
        std::string second;
    };
    
    StringPair Foo()
    {
        StringPair t;
        t.first = "Hallo!";
        t.second = "Tschuess!";
        return t;
    }
    
    int main()
    {
        StringPair Ergebnis = Foo();
        std::cout << Ergebnis.first << std::endl << Ergebnis.second;
    }
    

    mfg.


Anmelden zum Antworten