2016-11-21 5 views
2

Это консольная игра-лабиринт. Идея состоит в том, чтобы написать класс игры в файле заголовка и использовать класс в основном потоке. Я не уверен, что делаю это правильно, потому что получаю сообщение об ошибке. Как включить заголовочный файл в свой код?Что такое лучший способ включения заголовочных файлов в код на C++?

Я использую Cloud9, поэтому я не знаю, есть ли разница между Cloud9 и программным обеспечением IDE. Я очень новичок в C++, только использовал его в течение нескольких недель (3-4), поэтому я хотел бы знать, правильно ли я делаю это правильно.

Вот как структурирована мой код:

Это 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); 
    } 
}; 

Это MazeGame.cpp:

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

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

    return 0; 

} 

Оба файла находятся в тот же каталог. Тем не менее, я получаю эту ошибку на консоли:

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

Вы должны использовать '#include ' для встроенных заголовков и '#include" XXX.h "для пользовательских заголовков. –

+0

Пожалуйста, удалите свою 'this->' нотацию, она не нужна в C++. Язык C++ не является Java. –

+0

Возможно, вам захочется переместить более крупные определения методов в исходный файл, что должно ускорить процесс сборки. –

ответ

3

Поскольку файл заголовок является определенным пользователем, вы должны объявить его в двойных кавычках:

#include "MazeGame.h" 

, как вы пытались объявить это метод, который вы будете использовать для встроенного заголовки. Например:

#include <iostream> 
+0

что есть, если op добавляет папку, содержащую заголовок 'MazeGame.h', в каталог include компилятора ?? !!! это будет хорошо. посмотрите, например, в MSVC++ 15 'Дополнительные включенные папки' – Raindrop7

2

ВКЛЮЧАЕТ должен быть:

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

ошибка приходит от использования <...> для собственных заголовков, что вызывает компилятор ищет для заголовка в неправильное место.

Вы могли бы также рассмотреть вопрос о переносе определения функций члена в файле CPP, в результате чего в заголовке только их декларации подписи:

заголовочный файл:

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

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 
} 
... 

Кстати, это хорошая практика делать headers self sufficient, поэтому для включения в заголовок других заголовков они полагаются, не ожидая, что вы сделаете это в cpp (поэтому из-за строки std :: в заголовке было бы желательно включить <string>.

1

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

компилятор не может найти файл MazeGame.h на пути поиска.

Разница между #include "MazeGame.h" и #include <MazeGame.h> - это исправления, в которых компилятор ищет файл заголовка.Cloud9 использует GCC компилятор, который определяет include syntax таким образом:

#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

Таким образом, для пользовательских заголовков следует использовать "file" и в коде выше: #include "MazeGame.h".

0

письмо #include <> не обязательно, но по умолчанию для встроенного, но только для ваших компиляторов включают каталоги.

, так что если вы хотите, чтобы написать этот путь и работать тогда:

  • добавить папку новые файлы заголовков включать вашего компилятора, то вы можете написать:

    #include<MazeGame.h> 
    
  • или вы можете скопировать этот файл заголовка, чтобы включить папку, и она будет работать нормально. пример при установке новой библиотеки, такой как openGL, мы копируем заголовок в include folder и lib файлы в папку lib.

по умолчанию include "" используется говорит компилятору, что файл находится в текущем рабочем каталоге.

  • вы также можете написать: #include <iostream> поэтому компилятор в этом случае поиск iostream в текущем каталоге, и если он не находит его он ищет его в компилятора все включают папки (встроенные и добавлены каталоги)
+0

Извините, что я имел в виду:' #include "iostream" ' – Raindrop7

+1

Этот ответ был бы более полезен, если бы он содержал ссылки на спецификацию языка. – IInspectable