2017-03-09 13 views
0

私はちょうどC + +とグリップを取得し、ヘッダーファイルを使用するように進んでいます。私は全く混乱しています。私はドキュメンテーションを読んだことがありますが、私はそれを十分に理解することはできません。C++ヘッダーと未定義の参照

私はちょうどインタラクティブな愚かな「ゲーム」を作っています。それはおそらく破棄され、ヘッダーファイルの使用を練習できると考えられました。ここでは、今

terminal_test 
    ├── core.cpp 
    └── game 
     ├── game.cpp 
     └── game.h 

私core.cppです::これは私のファイル構造である他の

#include <iostream> 
#include <stdio.h> 
#include <unistd.h> 
#include "game/game.h" 

using namespace std; 

void mainMenu(); 
void rootInterface() { 

    cout << "[email protected]:~# "; 

} 

int main() { 

    system("clear"); 
    usleep(2000); 

    mainMenu(); 

    return 0; 

} 

void mainMenu() { 

    int menuChoice = 0; 

    cout << "[1] - Start Game"; 
    cout << "[2] - How To Play"; 
    cout << endl; 

    rootInterface(); 
    cin >> menuChoice; 

    if (menuChoice == 1) { 

     startGame(); 

    } else if (menuChoice == 2) { 

     cout << "This worked."; 

    } 
} 

すべてが正常に動作しますが、私のメニュー選択の下startGame();g++ core.cpp game/game.cppを使用してコンパイルすると、このエラーで復帰します:undefined reference to startGame();。私はまず、game.hを正しく検索していたかどうかを確認するために、#include "game.h"のようなディレクトリに変更してください。ここで

は私game.hです:

#ifndef GAME_H // Making sure not to include the header multiple times 
#define GAME_H 
#include "game.h" 

void startGame(); 

#endif 

game.cpp:

#include <iostream> 
#include <stdio.h> 
#include "game.h" 

int main(int argc, char const *argv[]) { 

    void startGame() { 

    cout << "It worked."; 

    } 

    return 0; 
} 

マイファイル構造はどちらか適切に命名されていませんそれだけのものだったので、私はちょうどそれを投げましたC++でヘッダーファイルを手に入れよう。

だから、ここに私の質問は以下のとおりです。

1) - このエラーは、特に何を言っていると私はそれを修正するために何をすべきでしょうか?

2) - ヘッダーファイルは他のファイルと通信して動作するために、そこに明確なドキュメント/ガイドがありますか?

+0

コンパイルとリンクの方法を表示します。問題はおそらくそこにあります。 game.cppの 'startGame'の –

+3

は' main'の中にネストされています。 1. 'startGame'はファイルスコープでなければなりません。 2. game.cppから 'main'を削除します。すでに' core.cpp'にあります。 – bolov

+0

'g ++ core.cpp game/game.cpp'が必要です。プログラムには他にもエラーがありますが(または実際のコードを投稿しないでください) –

答えて

3

ローカル関数定義は、あなたがここに欲しいものではありません。

#include <iostream> 
#include <stdio.h> 
#include "game.h" 

int main(int argc, char const *argv[]) { 

    // an attempt to define startGame() inside of main() 
    void startGame() { 

    cout << "It worked."; 

    } 

    return 0; 
} 

mainはあなたのgame.cppファイルでは必要ありません。メインの外側にstartGame()を定義する必要があります。

#include <iostream> 
#include <stdio.h> 
#include "game.h" 

// definition of startGame 
void startGame() { 

    cout << "It worked."; 

} 
+0

コンパイル中です。ありがとうございます。しかし、今はメインの外に持っているので、ユーザーがゲームを開始するようにプロンプ​​トを出した後、どうすればいいですか? –

+2

@ JordanSavellあなたは本当に基本的なチュートリアルを読むべきです。単にstartGame();で呼び出すだけです。それは内部の機能(私たちはそうではない)について話す場合を除いて、「メインの内部」であることはそれほど意味がありません。 mainMenu関数を見てください。基本的には同じです。メイン関数の前にmainMenuを宣言したのと同じように、ヘッダはstartGameを宣言します。ソースはstartGameを実装しています。ところで、できるだけ早くクラスで作業してください。 game.hはおそらくクラスのゲームのヘッダーになるはずのもののように見えます。 – Aziuth

+0

オハイオ州知っています。それは私が理解していないわけではない、私はメインからそれを取らなければならなかったので、私は混乱していたが、間違ったファイルを考えていた。あなたがちょうど言ったことは意味をなさない。私はこれらがどのようにしてより簡単に機能するかを見ることができます。 –