2010-05-11 2 views
1

Je travaille actuellement sur une implémentation Scrabble simple pour un projet de collège. Je n'arrive pas à en faire fonctionner une partie, par contre!C++ Débutant - Difficulté à utiliser les structures et les constantes!

Check this out:

Mon board.h:

http://pastebin.com/J9t8VvvB

Le sous-programme où l'erreur est:

//Following snippet contained in board.cpp 
//I believe the function is self-explanatory... 
//Pos is a struct containing a char, y, a int, x and an orientation, o, which is not //used in this particular case 
void Board::showBoard() 
{ 
    Pos temp; 
    temp.o = 0; 

    for (temp.y = 'A'; temp.y < (65 + TOTAL_COLUMNS); ++temp.y) 
    { 
     for (temp.x = 1; temp-x < (1 + TOTAL_ROWS); ++temp.x) 
     { 
      cout << _matrix[temp].getContents(); 
     } 
     cout << endl; 
    } 
} 

Les erreurs renvoyées au moment de la compilation:

http://pastebin.com/bZv7fggq

Comment se fait l'erreur que j'essaie de comparer deux Pos quand je compare char s et int s?

Je ne peux pas aussi vraiment placer ces erreurs ...

Merci pour votre temps!

EDIT:

Depuis mon projet tout dépend de Pos, je vais essayer de surcharger l'opérateur < pour elle ... Quelqu'un peut-il me donner quelques conseils à ce sujet? Gardez à l'esprit, je suis un débutant!

+0

Le code dans ces erreurs ne correspond pas à ce que vous avez collé ici. – Thomas

+0

Je suis terriblement désolé :(1 sec –

+0

'temp' est une structure, mais vous essayez de le passer comme un tableau d'index? –

Répondre

9
#define TOTAL_ROWS 15; 
#define TOTAL_COLUMNS 15; 

Ces définitions sont des préprocesseurs qui ne doivent pas se terminer par un point-virgule. Le point-virgule deviendra une partie du texte de substitution, de sorte que le compilateur voit quelque chose comme (65 + 15;) qui est clairement faux.

En C++, il est préférable d'utiliser const variables au lieu de #define s. Dans ce cas, vous pouvez mettre ce qui suit dans votre Board.cpp:

const unsigned int TOTAL_ROWS = 15; 
const unsigned int TOTAL_COLUMNS = 15; 

Vous pouvez ensuite les mettre à la disposition par votre tête en plaçant ces derniers dans Board.h:

extern const unsigned int TOTAL_ROWS; 
extern const unsigned int TOTAL_COLUMNS; 

encore plus propre est de les déclarer en tant que classe membres. Les mettre en Board.cpp:

const unsigned int Board::TOTAL_ROWS = 15; 
const unsigned int Board::TOTAL_COLUMNS = 15; 

Et Board.hpp, intérieur la section public de la définition class:

static const unsigned int TOTAL_ROWS; 
static const unsigned int TOTAL_COLUMNS; 

Ils doivent être static parce qu'ils ne sont pas à une Board instance spécifique, mais sont plutôt des propriétés de la classe dans son ensemble. Vous pouvez ensuite y accéder depuis l'extérieur de la classe Board en écrivant Board::TOTAL_ROWS etc.


L'autre problème est que vous créez un map<Pos, Cell>.Le modèle map exige que son type de clé (Pos) a un opérateur < valide défini sur elle; En interne, le map trie ses éléments en utilisant cet opérateur, ce qui permet de faire des recherches rapides. L'erreur se produit uniquement au point où vous essayez de rechercher quelque chose sur la carte; Cela est dû à la façon dont les modèles fonctionnent, alors ne vous cassez pas la tête en ce moment.

Une solution consiste à surcharger cet opérateur vous de définir un ordre sur Pos objets. Je ne recommanderais pas que pour un débutant, car

  • surcharge d'opérateur est une technique avancée et
  • vous devez être très prudent de définir un comportement cohérent, ou bien les map étoiles mauvaise conduite et
  • si vous faites cela, vous devez également surcharger >, <= et >=, == et !=.

Cela étant dit, est le code ici. Cela suppose que deux objets Pos avec les mêmes valeurs x et y sont considérés égaux; il ne regarde pas la valeur de o (ce qui est une chose étrange à avoir dans un type "coordonnée" de toute façon, et je ne sais pas à quoi il sert).

bool operator<(Pos const &l, Pos const &r) { 
    if (l.y < r.y) return true; 
    if (l.y > r.y) return false; 
    if (l.x < r.x) return true; 
    if (l.x > r.x) return false; 
    return false; 
} 

L'autre option (meilleure) est d'abandonner complètement le genre Pos, et représenter votre carte comme une matrice à deux dimensions, ou un vector de vector s. Son type serait alors vector<vector<Cell> >. (Notez l'espace entre > >! Sans cela, il sera analysé comme l'opérateur de décalage vers la droite >>!)

+0

Merci pour la réponse + suggestion Je suis désolé, qu'est-ce que tu veux dire, « disponible dans votre tête »? -------- Mon ensemble du projet a la base du type Pos ... Comment puis-je surcharger

+1

Si vous besoin d'accéder aux valeurs de 'TOTAL_ROWS' et' TOTAL_COLUMNS' de l'extérieur de 'Board.cpp', disons de' Main.cpp' ou quoi que ce soit, alors vous auriez besoin de ces déclarations.Si vous utilisez uniquement ces constantes dans 'Board.cpp ', vous n'avez pas à les déclarer dans l'en-tête. – Thomas

+0

Merci, en fait il y a une autre classe besoin de ces constantes. –

Questions connexes