5

ここに初めて投稿します。私は C++ プログラミングの初心者です。主に、これがどのように機能するかなど、常に興味深いので知りたいという理由で学習しています
。SFML 2.0 を使用して単純なゲームを作成しようとしています。 、私の質問は次のとおり
です。たとえば、列挙型があります。

    enum GameState
    {
        Menu,
        Battle,
        Map,
        SubMenu,
        Typing
    };

だから、私はその種の変数を作りたい

    GameState State = Menu;

そして、それを別のファイルに渡します

    extern GameState State;

しかし、私はエラーが発生します

    error: 'GameState' does not name a type

列挙型を別のファイルに渡す方法は? main.cpp でグローバル変数として作成し、それを別のファイルのヘッダーに含めることで、それを実行しようとしています。

4

2 に答える 2

9

列挙型をヘッダーファイルに入れ、それを使用#includeしてソースファイルにインクルードする必要があります。

このようなもの:

ファイルgamestate.h

// These two lines prevents the file from being included multiple
// times in the same source file
#ifndef GAMESTATE_H_
#define GAMESTATE_H_

enum GameState
{
    Menu,
    Battle,
    Map,
    SubMenu,
    Typing
};

// Declare (which is different from defining) a global variable, to be
// visible by all who include this file.
// The actual definition of the variable is in the gamestate.cpp file.
extern GameState State;

#endif // GAMESTATE_H_

ファイルgamestate.cpp

#include "gamestate.h"

// Define (which is different from declaring) a global variable.
GameState State = Menu;  // State is `Menu` when program is started

// Other variables and functions etc.

ファイルmain.cpp

#include <iostream>
#include "gamestate.h"

int main()
{
    if (State == Menu)
        std::cout << "State is Menu\n";
}

これで、グローバル変数Stateがファイルで定義されましたが、そのファイルでの宣言のおかげでgamestate.cpp、すべてのソースファイルで参照できます。さらに重要なことに、列挙型はソースファイルに含めるときにも定義されるため、定義されていないことに関するエラーはなくなります。gamestate.hexternGameStategamestate.h

宣言と定義の違いについては、https ://stackoverflow.com/a/1410632/440558などを参照してください。

于 2012-08-15T13:07:41.800 に答える
1

問題は、GameStateの意味を1つのファイルで定義したことのようですが、2つのファイルがその定義を知っている必要があります。これを実現する一般的な方法は、両方のソースコードファイル(おそらく.cpp)に(おそらく#includeを使用して)インクルードされるヘッダーファイル(拡張子は.h)を作成し、両方に表示されるようにすることです。これは、定義をコピーして貼り付けるよりも優れています(他の場所で使用するには、#includeステートメントが必要です。定義が変更された場合は、.hファイルで変更するだけで、それを含むすべてのファイルが再コンパイル時に変更されます) 。

于 2012-08-15T13:08:15.713 に答える