2010-05-11 6 views
0

Encore une autre question sur le projet Scrabble ... C'est une question simple.Débutant C++ - Problème lors de l'utilisation des constantes globales dans un fichier d'en-tête

Il semble que je ne parviens pas à obtenir mes constantes globales reconnues:

Mon board.h: http://pastebin.com/7a5Uyvb8

Erreurs retournées:

1>C:\Users\Francisco\Documents\FEUP\1A2S\PROG\projecto3\projecto3\Board.h(34): error:  variable "TOTAL_ROWS" is not a type name 
1>  vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 
1> 
1>main.cpp 
1>compilation aborted for .\Game.cpp (code 2) 
1>Board.cpp 
1>.\Board.h(34): error: variable "TOTAL_ROWS" is not a type name 
1>  vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 
1>         ^
1> 

Pourquoi cela? Pourquoi le compilateur attend-il des types?

Merci pour votre temps!

EDIT:

Mépris ma précédente édition ... Ceci est mon constructeur par défaut: Board :: Board() { _matrix (TOTAL_ROWS, vecteur (TOTAL_COLUMNS)); }

Je reçois l'erreur suivante.

1>.\Board.cpp(16): error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type 
1>  _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)); 
1>  ^

Pourquoi cela se produit-il?


J'ai réussi à résoudre tous les problèmes avec mon fichier. J'ai utilisé

Board::Board() : 
    _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) 
    {} 

à la place. Merci pour votre aide!

+0

S'il vous plaît nous montrer le fichier d'en-tête –

+0

Le fichier d'en-tête en question est dans mon post. Le lien pastebin. C'est plutôt grand, alors je l'ai téléchargé là-bas. –

+0

L'erreur que vous affichez est en ligne (34). Cependant, le fichier board.h auquel vous liez ne va qu'à la ligne (30). Vous devrez nous aider à comprendre exactement où se trouve l'erreur. Ma meilleure estimation, cependant, sera dans les réponses dans une minute. – abelenky

Répondre

4

La façon dont est écrit, vous définissez un fonction appelée _matrix qui retourne un vecteur. Donc TOTAL_ROWS devrait être un nom de type, car il est analysé en tant que type de paramètre. Je suppose que ce que vous essayez de faire est de définir une variable appelée _matrix qui est un vecteur.

Ce que vous voulez faire est d'abandonner le constructeur et d'initialiser la variable dans votre constructeur. Seules les valeurs intégrales constantes peuvent être initialisées dans le corps de la classe, au moins dans la version actuelle de la norme.

Laissant hors des parties sans importance:

Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) { } 

private: 
    vector< vector<Cell> > _matrix; 

Notez que ceci est juste un exemple. Vraisemblablement, vous avez un fichier d'implémentation avec un corps réel pour Board(), et vous devriez mettre l'initialisation là plutôt que directement dans l'en-tête ou vous obtiendrez des erreurs. L'important est que vous ne devriez pas le faire lorsque vous déclarez _matrix initialement.


Pour votre nouvelle question, extern const unsigned int TOTAL_COLUMNS = 15; définit TOTAL_COLUMNS chaque fois Board.h est inclus par un fichier. Les variables constantes à l'étendue de l'espace de noms ont un lien interne par défaut, donc si vous laissez le extern vous serez OK.

En général, si la variable n'est pas constante, vous prenez une approche similaire à celle de _matrix. Vous omettez l'initialisation dans l'en-tête, puis à l'intérieur d'un fichier implemenation remettiez:

board.h: extern const int TOTAL_COLUMNS;

board.cpp: extern const int TOTAL_COLUMNS = 15;

0

Vous ne pouvez pas appeler un constructeur dans le fichier d'en-tête (ou n'importe quel code d'ailleurs).

+0

Je suis désolé, je n'ai pas compris. –

+2

Même si je comprends ce que vous essayez de dire, votre réponse comme elle est formulée maintenant est erronée à bien des égards ... – KillianDS

1

Dans votre fichier d'en-tête, je vois:

private: 
    vector< vector<Cell> > _matrix(TOTAL_ROWS , vector<Cell>(TOTAL_COLUMNS)); 

Cela semble déclarer une variable membre privée, _matrix, et est apparemment un effort pour appeler le constructeur pour _matrix en même temps. Vous ne pouvez pas appeler le constructeur de cette manière. N'oubliez pas que votre fichier d'en-tête peut être inclus dans de nombreux fichiers de programme. Par conséquent, les en-têtes ne doivent pas contenir d'instructions d'exécution (certaines exceptions existent, telles que les méthodes en ligne et les modèles). Vous ne savez jamais où l'en-tête sera inclus, donc vous ne savez jamais où le code dans un fichier d'en-tête apparaîtra.

Il est conseillé d'écrire vos fichiers d'en-tête afin qu'ils soient sûrs d'être inclus n'importe où.

Si vous voulez continuer ce code, je suggère: Le constructeur de la Commission() devrait construire la variable membre explicitement:

Board::Board() : 
    _matrix(TOTAL_ROWS, .....); 
    // This will call the matrix constructor ONLY when the Board constructor is called. 
{ 
} 

Ensuite devrait être appelé le constructeur conseil, mais seulement dans un fichier .cpp , pas dans un fichier .h.

+1

En fait, les en-têtes * doivent * contenir les définitions des méthodes inline et template. –

+0

Ce n'est pas ce que je voulais faire. Je voulais faire de '_matrix' un vecteur de vecteurs avec la dimension TOTAL_COLUMNS * TOTAL_ROWS. Quelle est la bonne façon de faire cela? –

+0

@Mark B: ne pas confondre le débutant en introduisant des choses en ligne. Les débutants doivent savoir que les fichiers d'en-tête ne doivent pas inclure d'instructions de traitement (sauf quand ils en ont vraiment besoin). – abelenky

2

Vous essayez d'initialiser le vecteur sur sa définition, ce qui est la bonne façon de le faire pour les variables d'objet, la manière correcte est la suivante:

extern const unsigned int TOTAL_ROWS = 15; 
extern const unsigned int TOTAL_COLUMNS = 15; 
class Board 
{ 
public: 
     Board() : _matrix(TOTAL_ROWS, vector<Cell>(TOTAL_COLUMNS)) {} 
private: 
     vector< vector<Cell> > _matrix; 
}; 
1

Ceci est mon défaut constructeur:

Board :: Board() {_matrix (TOTAL_ROWS, vecteur (TOTAL_COLUMNS)); }

Je reçois l'erreur suivante. [....]

Vous n'avez pas suivi les exemples et la syntaxe fournis par @Dennis Zickefoose, @KillianDS, et moi-même.

Veuillez relire nos réponses et étudier notre code.

+0

Vous avez raison. Pardon. –