2015-12-27 2 views
0

Я пытаюсь создать простое текстовое приключение, и я разбиваю код на несколько заголовков, чтобы ускорить время компиляции и сделать его более организованным.В C++, как я могу ссылаться на функции в разных заголовочных файлах?

//main.cpp 
#include <iostream> 
#include <fstream> 
#include "main_menu.h" 
#include "file_select.h" 
using namespace std; 
int main() 
{ 
main_menu(); 
} 

Главный файл заголовка меню выглядит следующим образом:

\\main_menu.h 
#ifndef main_menu_H 
#define main_menu_H 
#include <iostream> 
#include "file_select.h" 
using namespace std; 
void main_menu() { 
cout << string(50,'\n'); 
cout << "      ADVENTURE OF THE SKYLANDS         \n"; 
cout << "================================================================================\n"; 
cout << "        CHAPTER 1           \n"; 
cout << "================================================================================\n"; 
cout << "       Scepter of The Winds         \n"; 
cout << "        v1.0.0           \n"; 
cout << "================================================================================\n"; 
char select; 
cout << "\n\n\n\n\n" << "MAIN MENU\n\n"; 
cout << "1. Start\n"; 
cout << "2. File Select\n"; 
cout << "3. Credits\n"; 
cout << "4. Exit Game\n"; 
cin >> select; 
if (select == 'S' || select == 's' || select == '1') { 

} 
else if (select == 'F' || select == 'f' || select == '2') { 
    file_select(); 
} 
else if (select == 'C' || select == 'c' || select == '3') { 
} 
else if (select == 'E' || select == 'e' || select == 'x' || select == 'X' || select == '4') { 
    return; 
    } 
    else { 
     cout << "Invalid Option!"; 
    } 
} 
#endif 
#include 

Наконец, выберите файл заголовка меню Файл и это, где у меня ошибка: «main_menu» не был объявлен в этой объем.

#ifndef file_select_H 
#define file_select_H 
#include <iostream> 
#include "main_menu.h" 
using namespace std; 
void file_select() { 
cout << "      FILE SELECT            \n"; 
cout << "==================================================================================\n"; 
cout << "1. File 1\n"; 
cout << "2. File 2\n"; 
cout << "3. File 3\n"; 
cout << "4. Return to Main Menu\n"; 
char fileselect; 
cin >> fileselect; 
if (fileselect == '1') { 
} 
else if (fileselect == '2') { 
} 
else if (fileselect == '3') { 
} 
else if (fileselect == '4') { 
main_menu(); 
} 
else { 
    cout << "Invalid Option."; 
} 
} 

#endif 
+2

Не помещайте функции * определения * в заголовочных файлах (если вы не объявлять их как '' static' или inline'). Вместо этого определите определения в отдельных исходных файлах и поместите только * объявления * в файлы заголовков. –

+0

И в чем ваш вопрос? Какая еще проблема у вас с кодом? –

+0

Как я могу исправить свой код, чтобы он работал? Например, как я могу ссылаться на функцию, например, на Header1.h, и хочу ссылаться на нее в Header2.h –

ответ

3

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

Декларация Пример (Файлы заголовков):

  • void file_select();
  • void main_menu();
  • int anotherExample(int);
  • bool finalExample(char optionalVariableName);

Дэфи Определение Пример (CPP файлы):

bool finalExample(char optionalVariableName) { 
    return (optionalVariableName == '\0'); 
} 

Это, как говорится, ваш код должен преобразовать в следующее:

main.cpp

#include "MainMenu.h" 

using namespace std; 

int main() { 
    main_menu(); 
    return 1; 
} 

MainMenu.h

#ifndef MAIN_MENU_H 
#define MAIN_MENU_H 

#ifndef FILE_SELECT_H 
#include "FileSelect.h" 
#endif 

void main_menu(); 

#endif 

MainMenu.cpp

#include <iostream> 
#include <string> 
#include "MainMenu.h" 

using namespace std; 

void main_menu() { 
    cout << string(50,'\n'); 
    cout << "      ADVENTURE OF THE SKYLANDS         \n"; 
    cout << "================================================================================\n"; 
    cout << "        CHAPTER 1           \n"; 
    cout << "================================================================================\n"; 
    cout << "       Scepter of The Winds         \n"; 
    cout << "        v1.0.0           \n"; 
    cout << "================================================================================\n"; 
    char select; 
    cout << "\n\n\n\n\n" << "MAIN MENU\n\n"; 
    cout << "1. Start\n"; 
    cout << "2. File Select\n"; 
    cout << "3. Credits\n"; 
    cout << "4. Exit Game\n"; 
    cin >> select; 
    if (select == 'S' || select == 's' || select == '1') { 

    } 
    else if (select == 'F' || select == 'f' || select == '2') { 
     file_select(); 
    } 
    else if (select == 'C' || select == 'c' || select == '3') { 
    } 
    else if (select == 'E' || select == 'e' || select == 'x' || select == 'X' || select == '4') { 
     return; 
    } 
    else { 
     cout << "Invalid Option!"; 
    } 
} 

FileSelect.h

#ifndef FILE_SELECT_H 
#define FILE_SELECT_H 

#ifndef MAIN_MENU_H 
#include "MainMenu.h" 
#endif 

void file_select(); 

#endif 

FileSelect.cpp

#include <iostream> 
#include <string> 
#include "FileSelect.h" 

using namespace std; 

void file_select() { 
    cout << "      FILE SELECT            \n"; 
    cout << "==================================================================================\n"; 
    cout << "1. File 1\n"; 
    cout << "2. File 2\n"; 
    cout << "3. File 3\n"; 
    cout << "4. Return to Main Menu\n"; 
    char fileselect; 
    cin >> fileselect; 
    if (fileselect == '1') { 
    } 
    else if (fileselect == '2') { 
    } 
    else if (fileselect == '3') { 
    } 
    else if (fileselect == '4') { 
     main_menu(); 
    } 
    else { 
     cout << "Invalid Option."; 
    } 
} 
+0

Я вижу только два вопроса с этим кодом, который вы показываете, один из них незначительный, и вам не нужно включать '' FileSelect.h'' в '' MainMenu.h'' или наоборот. Другое не является серьезной проблемой, но, тем не менее, важно, и именно эти символы или имена, начинающиеся с подчеркивания и сопровождаемые буквой uppr-case, зарезервированы для реализации (компилятор и стандартная библиотека), вы не должны использовать такие имена. –

+0

Спасибо за помощь, но я все еще получаю сообщение об ошибке, что у меня есть неопределенная ссылка на main_menu() в файле main.cpp –

+0

@JoachimPileborg Спасибо за ваш комментарий; перед заголовками не должно быть подчеркивания. Однако «FileSelect.h» содержит ссылку на «MainMenu.h» и наоборот, поэтому включение каждого из них должно выполняться в каждом. Тем не менее, спасибо за обновление. @LightWriter, вы уверены, что все файлы имеют одинаковое имя (я изменил main_menu.h на ** MainMenu.h **). –

Смежные вопросы