0

タイトルがちょっと物足りないかも。

「プレーヤー」と「アップグレード」の2つのクラスがあります

  • Player はアップグレード前に宣言されます。

しかし、Upgrade クラスへのポインターを使用する Player クラスのメソッドが必要です

コンパイルしようとすると、「アップグレード」が宣言されていません。サンプルコードをあげます。アップグレードには、プレーヤーへのポインターを持つメソッドもいくつかあるため、両方のクラスの場所を切り替えることはできないことに注意してください

class Player{
    string Name;
    getUpgrade(Upgrade *); // It's a prototype
};
class Upgrade{
    double Upgradeusec;
    somePlayerData(Player *); // It's a prototype
};

PD: 私はこれを 1 時間ほど探していましたが、結果はありませんでした。

注意: これは単なるサンプル コードです。実際のコードは大きくなるからです。

4

4 に答える 4

3

Player クラスの定義の前に Upgrade を宣言する必要があります。例えば

class Upgrade;
class Player { ... };
class Upgrade { ... };

もちろん、これは状況によっては望ましくない 2 つのクラス間の非常に緊密な結合を意味します。

于 2013-08-21T04:07:14.827 に答える
2

前方宣言できます。

クラスPlayerのコードを含むファイルで、すべての後#includesに次の行を上部に追加するだけです。#defines

class Upgrade;

class Player
{
      //the definition of the Player class
}

コンパイラはこの前方宣言を尊重し、文句を言わずに先に進みます。

于 2013-08-21T04:07:19.963 に答える
1

C ++の前方宣言とは何ですか?

コードに前方宣言を追加するだけです。

class Upgrade; //forward declaration
class Player{
    string Name;
    getUpgrade(Upgrade *); // It's a prototype
};
class Upgrade{
    double Upgradeusec;
    somePlayerData(Player *); // It's a prototype
}

;

于 2013-08-21T04:32:44.180 に答える
0

事前宣言が必要です。http://en.wikipedia.org/wiki/Forward_declaration C++ には、不完全な型を使用できる場合に固有の複雑な規則がたくさんあります。

class Upgrade;   //<<<< add this line.
Class Player{
    string Name;
    getUpgrade(Upgrade); // It's a prototype
};
Class Upgrade{
    double Upgradeusec;
    somePlayerData(Player); // It's a prototype
};
于 2013-08-21T04:09:21.577 に答える