2009-02-06 4 views
4

J'ai une classe appelée Cal et il est Cpp et son homologue .hC/C initialisation du tableau privé dans le fichier d'en-tête

Headerfile a

class Cal { 
    private: 
     int wa[2][2]; 

    public: 
     void do_cal(); 
}; 

fichier .cpp a

#include "Cal.h" 
void Cal::do_cal() { 
    print(wa) // where print just itterates and prints the elements in wa 
} 

Ma question est comment puis-je initialiser le tableau wa? Je n'arrive juste pas à le faire fonctionner.

J'ai essayé avec:

int wa[2][2] = { 
       {5,2}, 
       {7,9} 
       }; 

dans le fichier d'en-tête, mais je reçois des erreurs disant que je ne peux pas le faire car il est contre iso..something.

J'ai également essayé d'initialiser le tableau wa dans le constructeur mais cela ne fonctionnait pas non plus .. Qu'est-ce qui me manque?

Merci

Répondre

10

Si elle peut être statique , vous pouvez l'initialiser dans votre fichier .cpp. Ajouter le mot-clé statique dans la déclaration de classe:

class Cal { 
    private: 
     static int wa[2][2]; 
    public: 
     void do_cal(); 
}; 

et à la portée du fichier dans le fichier .cpp ajouter:

#include "Cal.h" 
int Cal::wa[2][2] = { {5,2}, {7,9} }; 
void Cal::do_cal() { 
    print(wa) // where print just itterates and prints the elements in wa 
} 

Si vous ne le changer, cela fonctionne bien (avec ce qui en fait const). Vous n'en avez cependant qu'un qui est partagé avec chaque instance de votre classe.

7

Vous ne pouvez pas initialiser des éléments de tableau dans une déclaration de classe. J'ai récemment essayé de trouver un moyen de le faire. D'après ce que j'ai appris, vous devez le faire dans votre fonction d'initialisation, un élément à la fois.

Cal::Cal{ 
    wa[0][0] = 5; 
    wa[0][1] = 2; 
    wa[1][0] = 7; 
    wa[1][1] = 9; 
} 

Il est possible (et probable) qu'il ya une meilleure façon de le faire, mais de mes recherches la semaine dernière, voici comment le faire avec un tableau à plusieurs dimensions. Je suis intéressé si quelqu'un a une meilleure méthode.

5

Vous ne pouvez pas le faire facilement. Si vous ne souhaitez pas spécifier chaque élément individuellement comme dans Perchik's answer, vous pouvez créer un tableau statique et memcpy que (ce qui sera probablement plus rapide pour la taille des tableaux non triviales):

namespace 
{ 
    const int default_wa[2][2] = {{5, 2}, {7, 9}}; 
} 

Cal::Cal 
{ 
    memcpy(&wa[0][0], &default_wa[0][0], sizeof(wa)); 
} 
+0

memcpy est dangereux ici. Si quelqu'un dans le futur change les dimensions ou le type d'un tableau sans refléter ces changements dans l'autre ... –

+0

C'est vrai, mais vous auriez le même problème avec n'importe quelle autre solution. Vous pouvez facilement lancer un assert (sizeof (wa) == sizeof (default_wa)) ici pour se protéger contre cela dans ce cas. –

+0

Vous pouvez vous assurer que les tailles de tableau correspondent toujours si vous les définissez comme ceci: 'int default_wa [] [2] = {{5, 2}, {7, 9}}; int wa [count (default_wa)] [count (default_wa [0])]; 'avec' nombre_define (ARRAY) ((sizeof (ARRAY))/(sizeof (ARRAY [0]))) ' – Christoph

Questions connexes