0

私は今約30分間グーグルで検索しましたが、私の問題に関連するものは何も見つかりませんでした:

私はVisual Studio C++ 2008を使用しています。このヘッダーで「stdafx.h」というヘッダーを宣言しました。必要なものをすべて宣言しました。グローバル変数もそこに入れたいのですが、これらのいずれかを使用したい場合変数、私は(コンパイル時に)エラーが発生します私の「stdafx.h」は次のようになります:

#pragma once

#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
windows header here....

// C RunTime Header Files
compiler related standard headers here....


// TODO: reference additional headers your program requires here
#ifndef aaab
#include "codename.hpp"
#define aaab
#endif

// and a load of other headers (all of my project) followed here
...
...
...

宣言の後、次のようにグローバルを定義しました。

Game *game;

「codename.cpp」でそれらを使用したい

ここにクラスの簡単なビューがあります

#include "stdafx.h"
#define MAX_LOADSTRING 100
other class related stuff here....


main function here....


void test()
{
    game = new Game(); // HERE IS THE ERROR
}
4

3 に答える 3

10

おそらくextern、ヘッダー ファイルのようにグローバルを宣言する必要があります。

extern Game *game;

次に、.cpp ファイルで定義します。

于 2011-02-08T17:33:56.260 に答える
3

グローバル変数を処理するいくつかのメソッドを次に示します。

  • 別の名前空間で定義する
  • 静的クラスにクラスター化する
  • アクセサー関数を持つ静的ソース
  • グローバル名前空間で定義

どのような場合でも、ヘッダー ファイルで変数を宣言し、ソース ファイルで定義する方法をお勧めします。

別の名前空間

これは、他の変数との衝突の可能性を減らし、他の関数による汚染を減らすため、グローバル名前空間で宣言された変数よりも優れています。

例:

namespace Math_Globals
{
  int a_math_int;
}

静的クラスにクラスター化

他の言語ではグローバル変数を使用できないため、クラスにクラスター化する必要があります。それらをクラス内で静的にし、クラスを静的にすると、1 つのインスタンスのみが提供されます。シングルトンパターンに似ています。

この設計により、グローバルをクラスター化し、衝突や不正アクセスに対する保護を強化できます。変数へのアクセスが困難であるほど、プログラマーが変数を使用する可能性は低くなります (衝突や不正アクセスを提供します)。

例:

static class Math_Globals
{
  public:
    static int math_global;  // Declaration.
};

int Math_Globals::math_global;  // This is how it would be defined.

アクセサー関数を使用したモジュール内の静的 C 言語での一般的な保護手段は、ソース モジュール内で変数 static を定義し、パブリックアクセサー関数を提供することです。これにより、ある程度のアクセス制御が可能になります。

例: Header.hpp:

int Get_Math_Global(void);
void Set_Math_Global(int new_value);

ソース.cpp:

static int my_math_global = INITIAL_VALUE;
int Get_Math_Global(void)
{
    return my_math_global;
}

void Set_Math_Global(int new_value)
{
    my_math_global = new_value;
    return;
}

グローバル名前空間

プログラマーの間のコンセンサスは、グローバル名前空間で定義された変数は悪であるということです。上記の方法(または他の方法)のいずれかが好ましいと言う人もいます。

グローバル変数は、再利用が困難な強く結合された関数とモジュールにつながる可能性があります。また、デバッグにおいて、変数の状態を予期しない値に変更した関数を見つけることは困難であり、時間がかかります。

于 2011-02-08T18:08:59.863 に答える
0

ggg2 つ以上の .cpp からインクルードされた、ヘッダーで指定されたグローバル変数を宣言しています。

グローバル変数は .cpp でのみ宣言し、必要に応じて .h で外部として定義する必要があります。

解決:

  1. ggg宣言を見つけます。
  2. externその前にキーワードを追加します。
  3. .cpp という名前の新しいグローバル変数を作成しますggg
于 2011-02-08T17:34:23.307 に答える