2016-11-21 2 views
2

Ceci est un jeu de labyrinthe basé sur la console. L'idée est d'écrire la classe de jeu dans un fichier d'en-tête et d'utiliser la classe dans le fil principal. Je ne suis pas sûr si je le fais bien parce que j'ai une erreur. Comment est-ce que j'inclurais un dossier d'en-tête dans mon code? J'utilise Cloud9 donc je ne sais pas s'il y a une différence entre Cloud9 et le logiciel IDE. Je suis très nouveau en C++, je ne l'utilise que depuis quelques semaines (3-4), donc j'aimerais savoir si je le fais correctement.Quelle est la meilleure façon d'inclure des fichiers d'en-tête dans un code C++?

Voici comment mon code est structuré:

Ceci est MazeGame.h:

#ifndef MAZEGAME_H 
#define MAZEGAME_H 

class Maze{ 
protected: 
    int width; 
    int height; 
    std::string maze; 

public: 
    Maze(int width, int height){ 
     this->width = width; 
     this->height = height; 
    } 

    static void setMazeBlock(std::string value){ 
     this->maze += value; 
    } 

    void destroyMazeBlock(int set){ 
     this->maze[set] -= this->maze[set]; 
    } 

    std::string getMazeDrawing(){ 
     return this->maze; 
    } 

    void setMazeDrawing(std::string val){ 
     this->maze = val; 
    } 

    void drawMaze(int times = 1){ 

     for(int i = 0; i <= times; ++i){ 
      std::cout << this->maze; 
     } 
    } 

    void generate(){ 
     for(int i = 0; i < this->width; ++i){ 
       this->setMazeBlock("#"); 
     } 
     this->setMazeBlock(std::endl); 
     for(int i = 0; i < this->width; ++i){ 
      this->setMazeBlock("#"); 
      for(int j = 0; j < this->height; ++j){ 
       this->setMazeBlock(std::endl); 
       if(j == this->width){ 
        this->setMazeBlock("#"); 
       } 
      } 
     } 
     for(int i = 0; i < this->width; ++i){ 
       this->setMazeBlock("#"); 
     } 
     this->setMazeBlock(std::endl); 
    } 
}; 

C'est MazeGame.cpp:

#include <iostream> 
#include <MazeGame.h> 

int main(){ 
    Maze m = new Maze(16, 16); 

    return 0; 

} 

Les deux fichiers sont en le même répertoire. Cependant, je reçois cette erreur sur la console:

/home/ubuntu/workspace/Maze/MazeGame.cpp:4:22: fatal error: MazeGame.h: No such file or directory 
#include <MazeGame.h> 
       ^
+7

Vous devez utiliser '#include ' pour les en-têtes intégrés et '#include" XXX.h "' pour les en-têtes définis par l'utilisateur. –

+0

Veuillez supprimer votre notation 'this->', elle n'est pas nécessaire en C++. Le langage C++ n'est pas Java. –

+0

Vous pouvez déplacer des définitions de méthodes plus importantes vers un fichier source, ce qui devrait accélérer votre processus de construction. –

Répondre

3

Depuis votre fichier d'en-tête est défini par l'utilisateur , vous devez le déclarer avec des guillemets doubles:

#include "MazeGame.h" 

La façon dont vous essayez de le déclarer est la méthode que vous utiliserez pour intégré en-têtes. Par exemple:

#include <iostream> 
+0

Que se passe-t-il si l'op ajoute le dossier contenant l'en-tête «MazeGame.h» au répertoire include du compilateur ?? !!! ça va bien se passer. regardez par exemple dans MSVC++ 15 'Additional include folders' – Raindrop7

2

includes devrait être:

#include <iostream>  // <...> for standard headers 
#include "MazeGame.h"  // "..." for your own headers 

L'erreur vient d'utiliser <...> pour vos propres têtes, ce qui provoque le compilateur à la recherche de votre tête en le mauvais endroit.

Vous pouvez également envisager de déplacer les définitions des fonctions membres dans le fichier cpp, laissant dans l'en-tête que leur déclaration de signature:

fichier d'en-tête :

class Maze{ 
protected: 
    ... 
public: 
    Maze(int width, int height); 
    static void setMazeBlock(std::string value); 
    ... 
}; 

fichier cpp:

Maze::Maze(int width, int height){ 
    this->width = width; 
    this->height = height; 
} 
void Maze::destroyMazeBlock(int set){ 
    maze[set] -= maze[set];  // n need for this-> here 
} 
... 

Au fait, c'est une bonne habitude de faire headers self sufficient, afin d'inclure dans l'en-tête les autres en-têtes dont ils dépendent, sans s'attendre à ce que vous le fassiez dans le cpp (donc en raison de la chaîne std ::, une inclusion de <string> dans l'en-tête serait souhaitable.

1

fatal error: MazeGame.h: No such file or directory #include <MazeGame.h>

compilateur ne peut pas trouver le fichier MazeGame.h sur le chemin de recherche.

La différence entre #include "MazeGame.h" et #include <MazeGame.h> correspond aux chemins où le compilateur recherche le fichier d'en-tête.Cloud9 utilise le compilateur GCC, qui précise include syntax cette façon:

#include <file> It searches for a file named file in a standard list of system directories. You can prepend directories to this list with the -I option

#include "file" It searches for a file named file first in the directory containing the current file, then in the quote directories and then the same directories used for <file> . You can prepend directories to the list of quote directories with the -iquote option

Donc, pour les en-têtes définis par l'utilisateur, vous devez utiliser "file" et dans votre code ci-dessus: #include "MazeGame.h".

0

écrire #include <> n'est pas nécessaire mais par défaut pour intégré mais seulement pour vos compilateurs inclure des répertoires.

donc si vous voulez écrire de cette façon et travailler ensuite:

  • ajouter le dossier de vos nouveaux fichiers d'en-tête pour inclure de votre compilateur vous pouvez écrire:

    #include<MazeGame.h> 
    
  • ou vous pouvez copier ce fichier d'en-tête pour inclure le dossier et cela fonctionnera bien. un exemple lors de l'installation de la nouvelle bibliothèque comme openGL nous copions l'en-tête à include folder et lib fichiers dans le dossier lib.

Par défaut, include "" indique au compilateur que le fichier se trouve dans le répertoire de travail en cours.

  • vous pouvez aussi écrire: #include <iostream> de sorte que le compilateur dans ce cas recherches de iostream dans le répertoire courant et si elle ne trouve pas il recherche dans tous du compilateur comprennent des dossiers (intégré et répertoires ajoutés)
+0

désolé je voulais dire:' #include "iostream" ' – Raindrop7

+1

Cette réponse serait plus utile, si elle contenait des références à la spécification du langage. – IInspectable