2010-04-18 5 views
0

je suit dans mon Puzzle.hComment initialiser le vecteur que j'ai défini dans mon fichier d'en-tête?

class Puzzle 
{ 
    private: 
     vector<int> puzzle; 
    public: 
     Puzzle() : puzzle (16) {} 
     bool isSolved(); 
     void shuffle(vector<int>&); 
}; 

puis mon Puzzle.cpp ressemble à:

Puzzle::Puzzle() 
{ 
    // Initialize the puzzle (0,1,2,3,...,14,15) 
    for(int i = 0; i <= puzzle.size(); i++) 
    { 
     puzzle[i] = i; 
    } 
} 

// ... other methods 

Suis-je utiliser la liste initialiseur mal dans mon fichier d'en-tête? Je voudrais définir un vecteur d'ints et initialiser sa taille à celle de 16. Comment dois-je faire cela?

G Output:

Puzzle.cpp:16: error: expected unqualified-id before ')' token 
Puzzle.cpp: In constructor `Puzzle::Puzzle()': 
Puzzle.cpp:16: error: expected `)' at end of input 
Puzzle.cpp:16: error: expected `{' at end of input 
Puzzle.cpp: At global scope: 
Puzzle.cpp:24: error: redefinition of `Puzzle::Puzzle()' 
Puzzle.cpp:16: error: `Puzzle::Puzzle()' previously defined here 
+0

Attention . Comme Neil le fait remarquer, votre tableau n'a que des éléments 'puzzle.size()', accessibles par 0 à l'aide de puzzle.size() - 1. Votre boucle va une à plusieurs fois, faites-la 'i GManNickG

Répondre

5

le problème est que vous avez défini Puzzle::Puzzle() tant dans l'en-tête et le fichier .cpp, il a deux définitions.

La liste des initialiseur peut aller de pair avec la définition du constructeur dans le fichier .cpp:

Puzzle::Puzzle() 
    : puzzle (16) 
{ 
    // ... 
} 

et supprimer la définition de l'en-tête:

Puzzle(); // I'm just a declaration now, not a definition 
1

Vous ne pouvez pas définir le constructeur deux fois! Ainsi, dans le fichier d'en-tête remplacer

Puzzle() : puzzle (16) {} 

par

Puzzle(); 

Et dans le fichier source .cpp ajouter

puzzle.resize(16); 

dans la première ligne.

2

Le problème principal est que vous définissez votre constructeur deux fois - une fois dans l'en-tête, puis à nouveau dans le fichier cpp. Retirez celui de l'en-tête et déplacer l'initialisation du cpp:

Puzzle::Puzzle() 
: puzzle (16) 
{ 
    // Initialize the puzzle (0,1,2,3,...,14,15) 
    for(int i = 0; i <= puzzle.size(); i++) 
    { 
     puzzle[i] = i; 
    } 
} 

De plus, à moins que vous êtes using std::vector - ou pire, using namespace std - dans votre tête (que vous ne devriez pas), votre vecteur doit être déclarée comme ceci dans l'en-tête:

std::vector<int> puzzle; 
2

Vous ne pouvez pas initialiser quelque chose dans deux différents lieux. Dans l'en-tête, juste déclarer:

Puzzle(); 

dans le fichier .cpp définir:

Puzzle::Puzzle() : puzzle(16) 
{ 
    // Initialize the puzzle (0,1,2,3,...,14,15) 
    for(int i = 0; i < puzzle.size(); i++) 
    { 
     puzzle[i] = i; 
    } 
} 

si vous seriez probablement mieux ne pas utiliser une liste d'initialisation:

Puzzle::Puzzle() 
{ 
    // Initialize the puzzle (0,1,2,3,...,14,15) 
    for(int i = 0; i < 16; i++) 
    { 
     puzzle.push_back(i); 
    } 
} 
+0

Ou« réserve »d'abord, bien qu'un tel petit cas ne fasse probablement aucune différence réelle. – GManNickG

+0

Juste remarqué que mon code OP et mon OP a un bug sévère off-by-one! Maintenant corrigé. –

+0

@GMan effectivement, compte tenu de la logique du programme OP, la réserve ne fonctionnerait pas. –