Probleme mit Klassen / meine erste Klasse......



  • Hallo,
    habe das Programm von ChrissiB noch ein wenig abgeändert, das läuft jetzt super, Großes Dank an ChrissiB und allen anderen, die sich so stark bemühen....

    aber nun habe ich doch noch ein Paar Fragen:

    1. wo genau liegt der Unterschied, ob ich nun cout oder std::cout nehme ???
      für das cout wird #include <iostream.h> benötigt für std::cout
      #include <iostream>
      Wo liegt der Unterschied ?

    2. Habe das Programm um name erweitert, was aber noch nicht ganz klappt.
      Verwende ich char name; ist alles OK keine Fehler/ Warnungen beim Compil.
      jedoch wird dann nur der Erste Buchstabe vom eingegebenem Namen wieder
      zurückgegeben.

    Nehme ich aber anstelle von char name; char name[15] kommt es zu mehreren
    Fehlern beim compil.

    #include <iostream.h> 
    
    class Klasse1
    { 
    	private:    
    		int alter;			// Variablendeklaration alter
    		char name;
    
    	public: 
    		inline int leseAlter() const	// inline (Empfehlung) + const methode 
    		{ 
    			return alter;		// Rückgabewert alter
    		}
    
    		inline char leseName() const	// inline (Empfehlung) + const methode 
    		{
    			return name;
    		}
    
    		int speicherAlter(int);		// Funktionsprototyp
    		char speicherName(char);	// Funktionsprototyp
    }; 
    
    int Klasse1::speicherAlter(int wald)// Funktion zum speichern von alter
    { 
    	alter = wald;				// alter gleich übergebener Variable wald
    	return alter;				// Rückgabewert alter
    } 
    
    char Klasse1::speicherName(char baum)// Funktion zum speichern von name
    { 
    	name = baum;				// alter gleich übergebener Variable baum
    	return name;				// Rückgabewert alter
    }
    
    int main()
    { 
        cout << "Alter: ";				// Ausgeben
        int wald;					// Variablendeklaration wald
        cin >> wald;				// Einlesen
        Klasse1 foo;				// ist nicht static, daher erst ein object erstellen
        foo.speicherAlter(wald);			// methode aufrufen
    	cout << foo.leseAlter() << "\n";	/*Ausgeben von object foo,
    						der public Funktion leseAlter*/
    
    	cout << "Name: ";			// Ausgeben
    	char baum;				// Variablendeklaration baum
        cin >> baum;				// Einlesen
        Klasse1 joo;				// ist nicht static, daher erst ein object erstellen
        joo.speicherName(baum);			// methode aufrufen
    	cout << joo.leseName() << "\n";		/*Ausgeben von object foo,
    						der public Funktion leseName*/
    
    	return 0;
    }
    

    Besten Dank für Eure Bemühungen



  • Also ein char speichert ja nur einen buchstaben

    ein feld of char z.b. *c speichert mehr, aber um wie und wo ect. willst du dich nicht wirklich kümmern

    deswegen mach es wie alle

    nimm string

    std::string name;
    da haste dann auch sehr viele methoden dafuer um bestimme sachen zu suchen

    z.b. string s1 = "hallo du Heinz wie gehts?";
    und dann kannste nach "Heinz" suchen ect.



  • Ach ja da wäre doch noch ne klitzekleine Kleinigkeit...

    was hat es denn mit

    inline int leseAlter() const    // inline (Empfehlung) + const methode
    

    der Inline-Methode auf sich und was mit const
    also Unterschied zwischen

    inline int leseAlter() const
    // und
    int leseAlter()
    

    THX



  • inline für compiler google mal. brauchst du aber nicht, da der compiler imho sowieso entscheidet ob er was inline macht oder nicht. inline wird grob gesagt bei kurzen fkt. genommen die... google einfach mal da sind da prof. antworten 😉

    const bedeutet in dem fall, imho das die methode keine membervaribalen verändern kann, in diesem fall ist es ja gewollt, da wir nur lesen möchten nicht die membervaribale alter verändern wollen

    std::cout und cout ist das gleiche

    cout liegt in einem namensraum ist keine "globale" sache wie

    int, char, #include ect

    ebenso string

    der namensraum heisst std

    du kannst deshalb den namensraum jedes mal angeben std::cout

    oder oben einmal

    using namespace std; machen dann nimmt er bei allen sachen std:: automatisch davor

    du kannst auch deine klasse in einem eigenen namensraum setzen

    z.b. testnamensraum
    und jedes mal das dann davorschreiben

    warum man das alles macht?

    weil es sehr sehr viele klassen gibt und man konflikte aus dem weg gehen will

    z.b. deine find() methode und die von string.find



  • ja nur das problem ist, das wenn ich

    using namespace std;
    

    hineinschreibe, dann gibts keim compil. imer fehler, so dass ich das wieder raus nehmen muss



  • Ohne Fehlermeldung des Compilers können wir nicht helfen..
    Also, was spuckt er aus? Es muss gehen, ansonsten hält sich dein Compiler nicht an den Standard. Daher: notfalls Compilertausch



  • Die Fehlermeldung sieht folgendermaßen aus

    C:\Eigene Dateien\Test Sourcecodes\Binary.cpp(5) : error C2871: 'std' : Existiert nicht oder ist kein Namespace
    Fehler beim Ausführen von cl.exe.

    Binary.exe - 1 Fehler, 0 Warnung(en)

    dann nehme ich das using namespace std; wieder raus und alles ist ok....
    was hat das zu bedeuten ? Muß der Compiler getauscht werden, wenn ja wie ??

    DANKE



  • mache ich in den code die Variablendeklaration folgendermaßen:

    char name[15];
    char baum[15];
    

    kommen folgende Fehlermeldungen...
    --------------------Konfiguration: Class03 - Win32 Debug--------------------
    Kompilierung läuft...
    Class03.cpp
    C:\Eigene Dateien\Test Sourcecodes\Class03.cpp(18) : error C2440: 'return' : 'const char [15]' kann nicht in 'char' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    C:\Eigene Dateien\Test Sourcecodes\Class03.cpp(35) : error C2440: 'return' : 'char [15]' kann nicht in 'char' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    C:\Eigene Dateien\Test Sourcecodes\Class03.cpp(52) : error C2664: 'speicherName' : Konvertierung des Parameters 1 von 'char [15]' in 'char' nicht moeglich
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    Fehler beim Ausführen von cl.exe.

    Class03.exe - 3 Fehler, 0 Warnung(en)

    Ohne diese Deklaration gab es dann vorher nicht den eingegebenen Name zurück, sondern nur den ersten Buchstaben, jetzt wiederrum nur ein Zeichen aus der ASCII Tabelle(DEZ:204 HEX:CC) Son Rahmenbaustein.....

    was hat das nun wieder zu bedeuten ?



  • Vergiss char[], nimm std::string! 🙂

    So kannst du es machen. 🙂

    #include <iostream>
    #include <string>
    
    class Person
    {
        private:    
            int alter;
            std::string name;
    
        public:
            int leseAlter() const
            {
                return alter;
            }
            const std::string& leseName() const
            {
                return name;
            }
            void speicherAlter(int);
            void speicherName(std::string);
    };
    
    void Person::speicherAlter(int alter_)
    {
        alter = alter_;
    }
    
    void Person::speicherName(std::string name_)
    {
        name = name_;
    }
    
    int main()
    {
        std::cout << "Alter: " << std::flush;
        int alter;
        std::cin >> alter;
    
        std::cout << "Name: " << std::flush;
        std::string name;
        std::cin >> name;
    
        Person cool_person;
        cool_person.speicherAlter(alter);
        cool_person.speicherName(name);
    
        std::cout << cool_person.leseAlter() << std::endl << cool_person.leseName() << std::endl;
    }
    
    using namespace std;
    

    müss gehen. Hast du ein uralten Compiler??



  • Ja vielen Dank ChrissiB
    jetzt läuft das Programm endlich... und damit ist meine erste sinnvoll verwendbar Klasse fertig 🙂 *MegaFreu*

    nur leider kann ich dir nix über die Compiler Version sagen... weiß nicht wie ich herausfinde, welche Vers. das ist.. Wo steht das genau ??

    Kann dir nur soviel sagen, das ich Visual C++ 6.0 verwende...

    Und was genau bedeutet folgende Zeile:

    const std::string& leseName() const
    

    wofür steht Const und string&

    THX



  • Du gibts eine Refernz auf ein konstanten String zurück. So verhinderst du mit const, dass man von außen dein internen Name abändern kann ohne Erlaubnis. (siehe setter-Funktionen). Das const dahinter sagt aus, dass die Funktion nichts ändern darf, d.h. in der Methode darf nichts zugewiesen werden und dergleichen. Schau in deinem Buch nach für nähere Details. Vielleicht ist es besser, den Dev C++ zu nehmen. 🤡


Anmelden zum Antworten