2-D const array in Klasse



  • Hi!
    Ich habe versucht dieses Array

    const int DirTable[8][2] = { 
    {  0, -1},	// oben
    {  1,  0},	// rechts
    {  0,  1},	// unten
    { -1,  0},	// links
    {  1, -1},	// rechts-oben
    {  1,  1},	// rechts-unten
    { -1,  1},	// links-unten
    { -1, -1} };// links-oben
    

    in einer Klasse als private zu erstellen, aber es kommt folgende Fehlermeldung:

    d:\mission\mission.h(80) : error C2059: Syntaxfehler: '{'
    d:\mission\mission.h(80) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    

    Wenn dieser Block mit dem Array außerhalb der Klasse steht funktioniert alles. Woran liegt das denn? Und wie mache ich es denn, wenn es in der Klasse stehen soll?

    Gruß



  • Du kannst einem Attribut erst zur Laufzeit Werte zuweisen...
    schreib die Deklaration normal hin und weis dem Array die Werte im Konstruktor der Klasse zu...



  • Klassenelemente kannst du auf diese Weise nur vorbelegen, wenn sie static sind - und bei deinem Array wäre es vermutlich auch angebracht, das zu machen (schon aus Platzgründen):

    class test
    {
    private:
      //Achtung: das deklariert das Array nur - die nötige Definition brauchst du noch extra
      static const int DirTable[8][2];
    ...
    };
    
    //Definition des Arrays
    const int test::DirTable[8][2] = {...};
    

    PS: Wie (bzw. ob) du ein objekt-eigenes const-Array vorbelegen kannst, bin ich mir momentan nicht sicher.



  • Hmm, schade leider klappen beide Tipps nicht. Bei beiden kommen unterschiedliche Fehler...

    Fehlermeldung bei Tipp von Kuldren:

    d:\mission\mission.h(16) : error C2439: 'mission::DirTable': Element konnte nicht initialisiert werden
    

    Fehlermeldung bei Tipp von CStoll:

    mission.obj : error LNK2005: "private: static int const (* mission::DirTable)[2]" (?DirTable@mission@@0QAY01$$CBHA) ist bereits in main.obj definiert.
    

    Entweder ich habe beim tippen irgendwo Fehler eingebaut oder beide Tipps waren nicht ganz korrekt...


  • Mod

    Shakesbier schrieb:

    Fehlermeldung bei Tipp von Kuldren:

    d:\mission\mission.h(16) : error C2439: 'mission::DirTable': Element konnte nicht initialisiert werden
    

    Es gibt gegenwärtig keine Möglichkeit, Arrays im Konstruktor zu initialisieren - damit sind const arrays als nicht-statische Member praktisch nicht möglich.

    Shakesbier schrieb:

    Fehlermeldung bei Tipp von CStoll:

    mission.obj : error LNK2005: "private: static int const (* mission::DirTable)[2]" (?DirTable@mission@@0QAY01$$CBHA) ist bereits in main.obj definiert.
    

    Entweder ich habe beim tippen irgendwo Fehler eingebaut oder beide Tipps waren nicht ganz korrekt...

    Die Definition darf nicht mehrfach im Programm auftauchen, also nicht im Header stehen.



  • Ich meinte dass du den einzelnen Elementen die Werte im Konstruktor zuweist...

    also

    class show{
    
    private:
    int arr[10][10];
    
    public:
    
         show(){
          arr[0][0]=12;
          arr[0][1]=34545;
          .
          .
          .
         }
    
    };
    


  • Shakesbier schrieb:

    Fehlermeldung bei Tipp von CStoll:

    mission.obj : error LNK2005: "private: static int const (* mission::DirTable)[2]" (?DirTable@mission@@0QAY01$$CBHA) ist bereits in main.obj definiert.
    

    Entweder ich habe beim tippen irgendwo Fehler eingebaut oder beide Tipps waren nicht ganz korrekt...

    Jede Variable darf nur einmal definiert werden (da ist es hilfreich, den Unterschied zwischen Deklaration und Definition zu kennen), das gilt auch für dein static-Array. Die Deklaration kommt (zusammen mit derrestlichen Klassendeklaration) in den Header, die Definition "const int test::DirTable[8][2]=...;" in die zugehörige .CPP (du hast doch hoffentlich eine).

    @Kuldren: Ja, das wäre ein Ansatz, aber es gibt etwas, was dagegen spricht, ihn hier einzusetzen: das Wörtchen 'const' 😉



  • @Kuldren: Ja, das wäre ein Ansatz, aber es gibt etwas, was dagegen spricht, ihn hier einzusetzen: das Wörtchen 'const'
    

    hehe..sorry..voll überlesen



  • Shakesbier schrieb:

    Hi!
    Ich habe versucht dieses Array

    const int DirTable[8][2] = { 
    {  0, -1},	// oben
    {  1,  0},	// rechts
    {  0,  1},	// unten
    { -1,  0},	// links
    {  1, -1},	// rechts-oben
    {  1,  1},	// rechts-unten
    { -1,  1},	// links-unten
    { -1, -1} };// links-oben
    

    in einer Klasse als private zu erstellen, aber es kommt folgende Fehlermeldung:

    d:\mission\mission.h(80) : error C2059: Syntaxfehler: '{'
    d:\mission\mission.h(80) : error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionstext wird übersprungen
    

    Wenn dieser Block mit dem Array außerhalb der Klasse steht funktioniert alles. Woran liegt das denn? Und wie mache ich es denn, wenn es in der Klasse stehen soll?

    Gruß Shakesbier

    in der Klasse so:

    class test 
    { 
    typedef int (*Ptr)[2];
    
    public: 
        Ptr const DirTable;
        const int d01, d02, d03, d04, d05, d06, d07, d08, 
                  d09, d10, d11, d12, d13, d14, d15, d16;
    
        test() : d01( 0), d02(-1),   /*oben*/
                 d03( 1), d04( 0),   /*rechts*/
                 d05( 0), d06( 1),   /*unten*/
                 d07(-1), d08( 0),   /*links*/
                 d09( 1), d10(-1),   /*rechts-oben*/
                 d11( 1), d12( 1),   /*rechts-unten*/
                 d13(-1), d14( 1),   /*links-unten*/
                 d15(-1), d16(-1),   /*links-oben*/
                 DirTable((Ptr)&d01) { }
    
        test& operator= (const test&) {  return *this; }
    }; 
    
    int main()
    {
        test a;
        int b = a.DirTable[0][1];
    }
    

    😉



  • CStoll schrieb:

    Jede Variable darf nur einmal definiert werden (da ist es hilfreich, den Unterschied zwischen Deklaration und Definition zu kennen), das gilt auch für dein static-Array. Die Deklaration kommt (zusammen mit derrestlichen Klassendeklaration) in den Header, die Definition "const int test::DirTable[8][2]=...;" in die zugehörige .CPP (du hast doch hoffentlich eine).

    Danke jetzt klappts! Hätte ich eigentlich wissen müssen, bin ja kein blutiger Anfänger mehr. Natürlich kenn ich den Unterschied zwischen Deklaration und Definition... 😉
    Irgendwie stand ich gestern ein bischen aufm Schlauch!


Anmelden zum Antworten