Const String Array mit { } definieren



  • OK, dann poste ich mal die komplette Klasse:

    #include <string.h>
    
    class CPropertyGenre
    {
    private:
    	//Variablen
    	string genreProperty;
    public:
    	//ID3v1-Genres
    	const string Genres[] = {"Rock", "Blues"}; //und so weiter
    	//Funktionen
    	void Set(string genre);
    	void Set(int genre);
    	void Get(string* genre);
    	void Get(int* genre);
    };
    


  • Time schrieb:

    ...

    ...
    class CPropertyGenre
    {
    ...
    	const string Genres[] = {"Rock", "Blues"}; //und so weiter
    ...
    

    Das geht nicht.
    Du kannst überhaupt kein adressierbares nonstatic-Member bereits in der Klassendefinition initialisieren - egal, welchen Typs es ist.
    Das geht zur "Lauf-" oder zur "Ladezeit" (z.B. im Konstruktor oder als static member).
    Und da bereits zur Compilezeit die Größe der Klasse bekannt sein muss (und ein Array in diese Größe mit eingeht), kannst Du Dir hier die Dimension auch nicht offen halten ("[]") ....
    Hier würde ich zu einem vector raten...

    Gruß,

    Simon2.



  • OK, vielen Dank für die Hilfe! 👍



  • Gut ich bin auch Neuling, aber wenn du die Genres gleich "mitlieferst" dann kannst du doch auch die Größe gleich mit eintragen, das müsste das Problem umgehen, oder?

    ...
    class CPropertyGenre
    {
    ...
        const string Genres[2] = {"Rock", "Blues"}; //und so weiter
    ...
    }
    

    Andernfalls wäre die Lösund mit new[] zu arbeiten???? aber Achtung, das ist keine antwort sondern eine Frage^^



  • Die Initialisierung ist dort trotzdem nicht erlaubt...

    Gruß,

    Simon2.



  • Innerhalb der Klassendefinition kann man nur konstante static Variablen von ganzzahligem Typ initialisieren. Sonst nichts.

    class CPropertyGenre
    {
        static const int sci = 0; // FUNKTIONIERT !!!
        const int ci = 0; //Fehler
        int i=; //Fehler
    };
    

  • Mod

    @Horroreyes schrieb:

    Sonst nichts.

    Aufzählungsvariablen 😉



  • Aufzählungsvariablen

    Na klar, die guten alten enums darf man nicht vergessen

    class CPropertyGenre
    {
        enum bla { bla1 = 4, bla2, bla3};
        static const short sci = bla2; // FUNKTIONIERT !!!
        static const bla foo = bla3; // FUNKTIONIERT !!!
    
    };
    

    Fliegenbeinzähler! 😃

    👍



  • @Horroreyes schrieb:

    Innerhalb der Klassendefinition kann man nur konstante static Variablen von ganzzahligem Typ initialisieren. Sonst nichts.

    class CPropertyGenre
    {
        static const int sci = 0; // FUNKTIONIERT !!!
        const int ci = 0; //Fehler
        int i=; //Fehler
    };
    

    Hmmmm ... ich meine hier mal gelesen zu haben, dass sie nicht "adressierbar" sind...

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Hmmmm ... ich meine hier mal gelesen zu haben, dass sie nicht "adressierbar" sind...

    Sind sie grundsätzlich schon. Damit die Variablen aber überhaupt eine Adresse haben (sonst knallts beim Linken), müssen sie zusätzlich zu der Inline-Initialisierung noch wie normale statische Variablen ausserhalb definiert werden.



  • LordJaxom schrieb:

    Simon2 schrieb:

    Hmmmm ... ich meine hier mal gelesen zu haben, dass sie nicht "adressierbar" sind...

    Sind sie grundsätzlich schon. Damit die Variablen aber überhaupt eine Adresse haben (sonst knallts beim Linken), müssen sie zusätzlich zu der Inline-Initialisierung noch wie normale statische Variablen ausserhalb definiert werden.

    💡 Ach ja - das war's.

    Gruß,

    Simon2.



  • Hmmmm ... ich meine hier mal gelesen zu haben, dass sie nicht "adressierbar" sind...

    Sind sie auch nicht, weil es sich ja nur um Deklarationen handelt. Wie gesagt Typen wie bool, short, int, enums, char, ..., die auch nocht static const sind bilden hierbei die einzige Ausnahme. Man kann sie ohne eigentliche Definition verwenden.

    Wenn man sie adressieren will, braucht man aber, wie LordJaxom schon sagte, die Defintion. Aber OHNE Initialisierung.

    Für sci aus

    class CPropertyGenre
    {
        static const int sci = 0; // FUNKTIONIERT !!!
        const int ci = 0; //Fehler
        int i=; //Fehler
    };
    

    würde z.B.

    const int CPropertyGenre::sci;
    

    reichen.


Anmelden zum Antworten