0

私の友人と私は一緒に C++ を学んでいて、質問があります。静的変数と静的関数を使用するクラスを含むヘッダー ファイルを作成しました。これらの関数と変数は合計 2 つ以上の .cpp ファイルにアクセスできる必要がありますが、ヘッダー内の静的変数を初期化しているため、ヘッダー ファイルはアクセスできます。一度しか読み取れません (変数の初期化が静的であるため)。

MainFunction.cpp ファイルにヘッダー ファイルのみを含めようとしましたが、これを行った場合、他の .cpp ファイルは静的変数と関数を使用できません。関数/変数を必要とする (現在) 両方の .cpp ファイルにヘッダー ファイルを含めると、静的変数が複数回初期化されるため、さまざまなリンク エラーが発生します。

クラスと静的変数の初期化を含むヘッダー ファイルを次に示します。

//PlayerStatistics.h
// Classes
class PlayerStatistics
{
public:
    // Functions To Change Player Statistics
    static void SetStats(short int HitPoints, short int MagickaPoints, short int Fatigue, short int Damage, short int Defense, short int Dodge, short int Block, short int SpellCastChance);
    static void SetLevel(short int Experience, short int Level);
    static void SetExperience(short int Experience);

    // Player Statistics
    static short int HitPoints;
    static short int MagickaPoints;
    static short int Fatigue;
    static short int Damage;
    static short int Defense;

    // Chance Based System Player Statistics (Relies on Fatigue Level)
    static short int Dodge;
    static short int Block;
    static short int SpellCastChance;

    static short int Experience;
    static short int Level;
};

// STATIC VARIABLES
short int PlayerStatistics::HitPoints = 20;
short int PlayerStatistics::MagickaPoints = 20;
short int PlayerStatistics::Fatigue = 20;
short int PlayerStatistics::Damage = 20;
short int PlayerStatistics::Defense = 20;
short int PlayerStatistics::Dodge = 20;
short int PlayerStatistics::Block = 20;
short int PlayerStatistics::SpellCastChance = 20;
short int PlayerStatistics::Experience = 0;
short int PlayerStatistics::Level = 1;

アクセスが必要な 2 つの .cpp ファイル:

1:

//PlayerCharcter.cpp
void PlayerStatistics::SetLevel(short int Experience, short int Level)
{
Experience = Experience;
Level = Level;
}

void PlayerStatistics::SetStats(short int HitPoints, short int MagickaPoints, short int Fatigue, short int Damage, short int Defense, short int Dodge, short int Block, short int SpellCastChance)
{
HitPoints = HitPoints;
MagickaPoints = MagickaPoints;
Fatigue = Fatigue;
Damage = Damage;
Defense = Defense;
Dodge = Dodge;
Block = Block;
SpellCastChance = SpellCastChance;
}

void PlayerStatistics::SetExperience(short int Experience)
{
Experience = PlayerStatistics::Experience;
}

void AddExperience()
{
// This is a Testing Function to test the Level Up system and should be removed once Creatures
// are added to the game, or it can be edited to include proper experience points given for
// killing curtain enemies.

short int GetExperienceNumber;
std::cout << "How many experience points do you want? \n";
std::cin >> GetExperienceNumber;

PlayerStatistics::Experience = (PlayerStatistics::Experience += GetExperienceNumber);
std::cout << GetExperienceNumber << " Experience Points Added! \n \n \n \n \n";
}

2:

//WordBank.cpp
        std::cout << "\n \n \n \n \n \n \n \n \n \n \n \n"
        << PlayerName << "'s Character Sheat! \n \n \n"
        << "Level: " << PlayerStatistics::Level << "\n"
        << "Experience: " << PlayerStatistics::Experience << "\n \n \n"
        << "Health: " << PlayerStatistics::HitPoints << "\n"
        << "Magicka: " << PlayerStatistics::MagickaPoints << "\n"
        << "Fatigue: " << PlayerStatistics::Fatigue << "\n"
        << "Attack: " << PlayerStatistics::Damage << "\n"
        << "Defense: " << PlayerStatistics::Defense << "\n"
        << "Dodge Skill: " << PlayerStatistics::Dodge << "\n"
        << "Block Skill: " << PlayerStatistics::Block << "\n"
        << "Spell Casting Skill: " << PlayerStatistics::SpellCastChance << "\n"
        << "\n \n \n \n \n \n \n" << "To Continue Type Any Key In And Hit Enter" << std::endl;

このヘッダー ファイルをこれら 2 つの .cpp ファイルに #include する必要があります (このクラスへのアクセスを必要とするさらに 2 つのファイルが計画されています) が、実際にヘッダー ファイルを読み取るのは 1 回だけです (そのため、静的変数の初期化をそれ以上読み取らないようにすることができます)。一度)。私たちはコンストラクターを避けようとしています (主に、静的を使いやすくするためだけでなく、学習目的のためにも)。ヘッダー ガードについて読みましたが、この問題でそれらを機能させる方法がわかりません。

あなたが持っているヒント/アドバイスは非常に高く評価されます!

4

1 に答える 1

1

おそらく、ヘッダー ファイルには変数の宣言のみを配置する必要があります (これらは、静的変数、グローバル変数、または外部リンケージを持つ静的メンバー変数ではなく、extern にする必要があります)。PlayerStatistics.hしたがって、(ヘッダーファイルで)のような静的メンバー変数の宣言を続けます

class PlayerStatistics {
   /// ....
   static short int HitPoints;
};

(外部リンケージのあるスタティックメンバ変数宣言です)

次に、次のような定義を置くことができます

short int PlayerStatistics::HitPoints = 20;
short int PlayerStatistics::MagickaPoints = 20;
short int PlayerStatistics::Fatigue = 20;

1 つの実装ファイル (多くの場合、慣習的に を含むものmain、たとえば some main.cpp)。

おそらく、ヘッダー ファイルにインクルード ガードを配置する必要があります。

#ifndef PLAYER_STATISTICS_INCLUDED
#define PLAYER_STATISTICS_INCLUDED

そしてそれを終わらせる

#endif /*PLAYER_STATISTICS_INCLUDED*/

既存の C++ フリー ソフトウェア アプリケーションのソース コードを調べることを強くお勧めします (たとえば、 http: //freecode.com/または他のフリー ソフトウェア コレクションから)。これはあなたに多くのことを教えてくれます。

于 2012-09-17T04:30:44.223 に答える