Totale C++ Anfängerfrage...Klassen



  • Hi Leute,

    Ich wusste nicht so recht unter was ich suchen sollte (habe char[ eingetippt, gibt dann aber ja unendlich viele Ergebnisse 😉 )
    Ich lerne gerade C++ und ich probiere aus einem Buch den Code ein wenig anzupassen, aber es funktioniert nicht so ganz wie ich will.

    class cat
    {
    	public:
    		char GET_NAME() const
    		{
    			return name;
    		};
    
    		bool SET_NAME(char new_name[20])
    		{
    				name = new_name;
    				return true;
    		};
    
    	private:
    		char name[20];
    };
    

    Das ist meine Klasse.Wenn ich mein Programm dann allerdings kompiliere,kommt diese Fehlermeldung:

    D:\C++\1st\main.cpp(10) : error C2440: 'return' : cannot convert from 'const char [20]' to 'char'
            This conversion requires a reinterpret_cast, a C-style cast or function-style cast
    D:\C++\1st\main.cpp(15) : error C2440: '=' : cannot convert from 'char []' to 'char [20]'
            There are no conversions to array types, although there are conversions to references or pointers to arrays
    Error executing cl.exe.
    

    Ich habe schon probiert die GET_NAME-Funktion so zu schreiben: "char[20] GET_NAME...", was mir aber auch nichts als Fehler brachte.

    Bin das ganze Umgehen mit den Types ziemlich ungewohnt, da Ich eigentlich ein PHP-Experte bin... :p Danke für jede Hilfe oder Denkanstoss 😉



  • benutz statt char[] lieber STL-Strings

    #include <string>
    
    using namespace std;
    
    class bla
    {
    private:
    
        string myString1;
    
        // ...
    
    };
    


  • Hmmm, danke, bin schon weitergekommen, aber nun scheint "cout" nicht mehr zu funktionieren.

    D:\C++\1st\main.cpp(32) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
    Error executing cl.exe.
    

    printf("%s", x);
    ^^ Funktioniert leider auch nicht, das Programm stürzt mit einem Memory Access Error ab... 🙄
    Das ist mein main-Routine:

    int main()
    {
    	cat lucky;
    	lucky.SET_NAME("Lucky");
    	string x;
    	x = lucky.GET_NAME();
    	printf("%s", x); ///// bzw. cout << x;
    	return 0;
    };
    


  • Zur 1. Fehlermeldung:
    Du kannst keine char-array zurückgeben, du kannst nur einen Zeiger auf sein erstes Element zurückgeben.

    char *GET_NAME() const
    {
        return name;
    }
    

    Zur 2. Fehlermeldung:
    Du musst, um in einen char-array eine Zeichenkette zu kopieren, folgende Funktion verwenden strcpy, oder was besser ist strncpy:

    strcpy(name, new_name); // Schlecht, da hier die Grenzen nicht überprüft werden!
    strncpy(name, new_name, 20); // Kopiert nicht mehr als 20 Zeichen in name.
    

    Gruß Wolle



  • @Wolle:
    Danke, es funktioniert, allerdings nur wenn ich das 'const' aus GET_NAME wegnehme.

    D:\C++\1st\main.cpp(13) : error C2440: 'return' : cannot convert from 'const char [20]' to 'char *'
            Conversion loses qualifiers
    

    Naja, immerhin geht es jetzt.Danke, vorallem dafür, dass ich noch um diese Uhrzeit Hilfe kriege... 😃



  • probier bei der ausgabe mal:

    using namespace std;
    cout << x;
    
    // oder
    
    std::cout << x;
    


  • Naja hab gerade nichts besseres zu tun.
    🤡



  • Wolle. schrieb:

    probier bei der ausgabe mal:

    using namespace std;
    cout << x;
    
    // oder
    
    std::cout << x;
    

    Funzt immernoch nicht...Gleicher Fehler...

    D:\C++\1st\main.cpp(33) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable conversion)
    Error executing cl.exe.
    

    Bei "std::cout << x;" kommt der Fehler "cout ist not a part of std" oder sowas...



  • Dann musst du iostream includieren (ohne .h !!!)

    #include <iostream.h> // alter Standard und sollte nicht mehr verwendet werden.
    #include <iostream> // so ist es richtig.
    


  • Achso, super, nun gehts! 😃
    Wo liegt der Unterschied zwischen den beiden iostreams?Kann Ich mit <iostream> auf die gleichen Funktionen bzw. mehr Funktionen zugreifen als mit der <iostream.h>?



  • Also mit den neuen Headerdateien wurden namespaces eingeführt (deshalb vorhin dein Problem), sonst gibt es für den endbenutzer eigentlich keinen unterschied, du hast mit den neuen Headern die selben Typen, funktionen, Methoden, ...
    der hauptsächliche Unterschied liegt da mehr im Design, denn die neuen Header müssen nicht so heißen wie sie inkludiert werden und sie können auch auf mehrere Dateien aufgeteilt sein (was für den Programmieren jedoch relativ uninteressant ist).



  • Hmmm...Ich weiss leider nochnichteinmal was ein Namespace ist...Naja,kommt noch, ich bin ja gerade erst auf Seite 129 von meinem 796-seitigen Buch 😃 ("C++ in 21 Tagen" wen's interessiert)


Anmelden zum Antworten