2015-12-27 97 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);

的Defi nition實例(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

我只看到這個代碼出現了兩個問題,一個是小問題,你不需要在''MainMenu.h''中包含''FileSelect.h'',或者反過來。另一個不是主要問題,但它仍然很重要,那就是以下劃線開頭的符號或名稱後跟一個uppr-case字母是爲實現(編譯器和標準庫)保留的,您不應該使用這樣的名。 –

+0

感謝您的幫助,但我仍然得到一個錯誤,我有一個未定義的參考main_menu()在我的main.cpp文件 –

+0

@JoachimPileborg感謝您的評論;頭文件不應該以下劃線開頭。但是''FileSelect.h''包含對''MainMenu.h''的引用,反之亦然,所以每個文件中的include都必須在每個文件中進行。儘管如此,感謝您的更新。 @LightWriter,你確定所有的文件都是相同的名稱(我將main_menu.h更改爲** MainMenu.h **)。 –

相關問題