Frage zu Arrays als Klassenmember (Elementinitialisierung)



  • Hallo.

    Ich habe eine Frage zu folgendem Codeausschnitt:

    class PlayingField
    {
        private:
    
            char playingField[3][3];
    
        public:
    
            PlayingField()
            : playingField( (char[3][3]) { {' ', ' ', ' '},
                                           {' ', ' ', ' '},
                                           {' ', ' ', ' '}
                                         }
                          )
            {
    
            }
    
    };
    

    Mein gcc-Compiler übersetzt dies tadellos und initialisiert das array auch richtig.
    Lasse ich allerdings den Type-Cast zum char-Array weg, gibt der Compiler eine Fehlermeldug aus.
    Lasse ich den Type-Cast bestehen und ändere { {' ', ' ', ...} } zu
    {' ', ' ', ... }, gibt mir der Compiler folgende Warnungen aus:

    D:\c++\Projekte\TicTacToe\playingfield.h:: In constructor `PlayingField::PlayingField()':
    D:\c++\Projekte\TicTacToe\playingfield.h:16: warning: aggregate has a partly bracketed initializer
    D:\c++\Projekte\TicTacToe\playingfield.h:16: warning: aggregate has a partly bracketed initializer
    D:\c++\Projekte\TicTacToe\playingfield.h:16: warning: aggregate has a partly bracketed initializer
    :: === Build finished: 0 errors, 3 warnings ===

    Erste Frage: Warum gibt der Compiler bei oben stehenden Änderungen einen Fehler aus? Schließlich könnte ich dem Array, wenn ich es global oder lokal definieren würde, auch eine Initialisierungliste übergeben ohne den Type-Cast und auch ohne zusätzliche spitze Klammern.

    Zweite Frage: Ist es standardkonform ein Array wie oben zu initialisieren, d. h., würde der oben stehende Codeausschnitt von allen C++-Compilern korrekt übersetzt werden?

    Tschuldigung für die wahrscheinlich dummen Fragen, aber ich hab im Internet nichts zu diesem Thema gefunden, außer das es nicht möglich sei, ein Array, dass als (nicht-statische) Membervariable deklariert ist, in einer Elementinitialisierungsliste zu initialisieren. Dass dies aber doch möglich ist (zumindest bei dem gcc-Compiler) sieht man ja an oben stehenden Codeausschnitt.


Anmelden zum Antworten