String in Klasse deklarieren Error C2864



  • Hallo, ich habe folgendes Problem:
    Ich möchte in einer Klasse einen String deklarieren. Dieser String soll in der Elementfunktion strLen() weiterverwendet werden. Hierzu habe ich zwei Fragen/Probleme:
    Wenn ich den String wie in dem vereinfachten Codebeispiel unten deklarieren will kommt immer der Fehler:

    "error C2864: "wort::String1": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden"

    Ich habe ihn schon versucht mit const char zu deklarieren aber es klappt ebenso nicht. Die Suche über google ergab leider keine hilfreichen Treffer.

    class wort {
        char String1[6] = "Hallo";
        int strLen();
    };
    
    void wort::strLen()	{
    	int count = 0;
    	while(String1[count] != '\0') 	{			
    	    count++;
    	}
    	printf("%d",&count);
    }
    

    Meine zweite Frage betrifft die Weiterverarbeitung des Strings in strLen().
    Laut dem Buch das ich zur Hand habe ist der Funktion die Variable String1 bekannt, da diese Funktion zur Klasse gehört. Jedoch meckert der Compiler an der entsprechenden Stelle der Funktion, dass die Variable String1 nicht deklariert ist und somit unbekannt.

    Ich hoffe ihr könnt mir (für einen Anfänger) verständliche Tipps und Lösungen der beiden Probleme geben, falls ihr weitere Infos benötigt, fragt einfach.



  • Seit C++11 müsste das gehen. Welche Version von Visual Studio benutzt du? Im übrigen stimmt der Rückgabewert von strLen in der Deklaration nicht mit dem der Definition überein.



  • Du musst String entweder im Konstruktor initialisieren oder du benutzt C++11 und somit geschweifte Klammern, statt dem '='-Operator.

    Seit C++11 müsste das gehen.

    Nö.



  • Geht ganz einfach: Benutze keine C-strings (und printf).



  • Techel schrieb:

    ... (und printf).

    Das du auch falsch benutzt.



  • Kopiere die Fehlermeldung. Zeige den Code, der den Fehler produziert.

    Deine Member sind alle private. Du kannst sie also nicht außerhalb von Memberfunktionen (also hier nie) benutzen.

    Wenn dir das Buch printf beibringt, schmeiß es ins Altpapier.



  • Als allgemeienr Tipp, diese error codes kann man suchen. Es gibt einige Seiten die zu den codes passende Fehlermeldungen mit Beispielen zur verfügung stellen die zeigen was genau nciht geht und wie man das richtig machen kann. Ist bei einigen Fehlern durchaus sehr praktisch.



  • eine Member sind alle private. Du kannst sie also nicht außerhalb von Memberfunktionen (also hier nie) benutzen.

    Sindn im Code public...wie gesagt das ist nicht der ganze code sondern vereinfacht.

    Ratgeber schrieb:

    Du musst String entweder im Konstruktor initialisieren

    Habe ich zuvor schon versucht. Hat denselben Fehler ergeben. Ich hatte es in folgendem Schema:

    wort(){
        char String1[6] = "Hallo";
    };
    

    oder du benutzt C++11 und somit geschweifte Klammern, statt dem '='-Operator.

    Wie meinst du das?


  • Mod

    Gast1000 schrieb:

    Habe ich zuvor schon versucht. Hat denselben Fehler ergeben. Ich hatte es in folgendem Schema:

    wort(){
        char String1[6] = "Hallo";
    };
    

    So hast du eine lokale Variable in deinem Konstruktor definiert.



  • Gast1000 schrieb:

    eine Member sind alle private. Du kannst sie also nicht außerhalb von Memberfunktionen (also hier nie) benutzen.

    Sindn im Code public...wie gesagt das ist nicht der ganze code sondern vereinfacht.

    Das ist nicht vereinfacht sondern unbrauchbar.



  • Ratgeber schrieb:

    Seit C++11 müsste das gehen.

    Nö.

    Warum nicht?

    ~/test$ cat cppinit.cc 
    #include <iostream>
    
    struct wort { 
        char String1[6] = "Hallo"; 
        int strLen(); 
    }; 
    
    int main(){
        wort w;
        std::cout << w.String1 << "\n";
    }
    
    ~/test$ g++ -Wall -Wpedantic -std=c++11 cppinit.cc
    ~/test$ ./a.out 
    Hallo
    


  • wob schrieb:

    Ratgeber schrieb:

    Seit C++11 müsste das gehen.

    Nö.

    Warum nicht?

    Kann ich auch nicht nachvollziehen. Mit Clang funktioniert es genauso und VS2015 nimmt es auch. VS2013 scheint das feature noch nicht implementiert zu haben.


Log in to reply