0

以下の構造を定義して、複数のクラスがアプリケーション全体で使用できるようにしました。

ZHTypes.h

#ifndef ZHTypes_h
#define ZHTypes_h

struct BeingHitParams
{
    bool isApplyKnockBack=true;
};
BeingHitParams *default_BeingHitParams_ptr = new BeingHitParams();

#endif

次の変数を定義しました

default_BeingHitParams_ptr

この場合、常に新しい構造を作成する必要がないため、関数のデフォルト パラメーターとしていくつかの場所で使用します。

とにかく、上記で定義された変数は、クラス内のコードで参照するたびにリンク エラーを生成します。しかし、前にstaticを追加すると、正常に動作します。

static BeingHitParams *default_BeingHitParams_ptr = new BeingHitParams();

私の質問は、クラス内からグローバルで非静的な変数にアクセスできないのはなぜですか? また、上記の状況のように変数へのアクセスが C++ で制限されている理由についての追加説明も知りたいです。

4

1 に答える 1

6

その前に置くstaticと、内部リンケージが与えられ、そのヘッダーを含む各翻訳単位には独自の のコピーがありdefault_BeingHitParams_ptrます。実際にやりたいことexternは、ヘッダー ファイルで宣言し (外部リンケージを作成するだけでなく、定義ではなく宣言にすることもできます)、単一の翻訳単位で定義することです。

// ZHTypes.h
// Now this is just a declaration:
extern BeingHitParams *default_BeingHitParams_ptr;

// ZHTypes.cpp
// Defined in a single translation unit:
BeingHitParams* default_BeingHitParams_ptr = new BeingHitParams();

ただし、グローバルな状態を導入することは通常悪いことです

于 2013-03-07T13:38:44.890 に答える