0

20 以上のクラス/ヘッダー ファイルを持つプログラムがあります。昨日、いくつかの変更を開始するまで、すべてが順風満帆でした。ヘッダーの1つで前方宣言が必要であることを理解するのに、文字通り永遠にかかりました. 昨日も同じ作業をしていましたが、クラスの前方宣言を使用していませんでした。

ただし、正しくコンパイルして実行することができました。もう1つのメソッドを追加しようとしました..そして、これらすべてのおかしなエラーが再び発生し始めました! 私が言ったように、昨日、これらすべてが機能していました。どういうわけか、1つの変更を加えて、そのクラスなどを変更していないにもかかわらず、「クリーチャーが宣言されていません」というエラーが発生し続けました..他のクラスおよびそれらのクラスの他のオブジェクト。

ヘッダーは、エラーがあると書かれているファイルに含まれています。おそらく、試してみるためだけに追加のインクルードを追加しました。とてもイライラするので、どうすれば昨日の状態に戻ることができるかを考えるのに何時間も費やしています.そして、単純に別の機能を追加しようとすると、同じことが起こりました!! この絶え間ない欲求不満を解決するのを手伝ってください。現在発生しているエラーは次のとおりです。

g++ -c Ammunition.cpp -o Ammunition.o -std=c++0x
g++ -c Armor.cpp -o Armor.o -std=c++0x
g++ -c Consumable.cpp -o Consumable.o -std=c++0x
g++ -c Creature.cpp -o Creature.o -std=c++0x
In file included from DungeonLevel.h:4:0,
             from Creature.h:5,
             from Creature.cpp:1:
Tile.h:15:19: error: ‘Creature’ has not been declared
Tile.h:16:2: error: ‘Creature’ does not name a type
Tile.h:38:2: error: ‘Creature’ does not name a type
In file included from DungeonLevel.h:7:0,
             from Creature.h:5,
             from Creature.cpp:1:
Player.h:9:32: error: expected class-name before ‘{’ token
make: *** [Creature.o] Error 1

エラーが発生しているヘッダー ファイルとスニペットは次のとおりです。

DungeonLevel.h

#include "Tile.h"
#include <vector>
#include <random>
#include "Player.h"

class Player; //This is how I fixed the error that took me all day when "Player" was not
              //declared. If you take it out, You'll get error "Player not declared"
class DungeonLevel {
public:
    DungeonLevel(int iWidth, int iHeight, std::mt19937 & randomGen);
    ~DungeonLevel(void);

    void dump();
    char at(int x, int y);

    void placeInGame(Player& playerToPlace, std::mt19937 & randomGen);
    int getWidth();
    int getHeight();

private:
    std::vector<std::vector<Tile>> m_vvTiles; //Tile was char

};

DungeonLevel.cpp

#include <iostream>
#include <random>
#include "Tile.h"
#include "DungeonLevel.h"
#include "Player.h"

using namespace std;


void DungeonLevel::placeInGame(Player & playerToPlace, std::mt19937 & randomGen$
    int x;
    int y;
    do {
            y = randomGen() % 20;
            x = randomGen() % 79;
    } while (m_vvTiles[y][x].getDisplayChar() != '.');

    m_vvTiles[y][x].setCreature(&playerToPlace);
}
//Then other code that I don't think is needed

Creature.h

#include "Entity.h"
#include "DungeonLevel.h"

class Creature : public Entity {

public:
    Creature(void);
    virtual ~Creature(void);

    virtual void dumpObject();
    virtual void dumpObjectData();
    virtual void writeFragment(std::ostream & output);
    virtual void writeDataAsFragment(std::ostream & output);
    virtual void setElementData(std::string elementName, std::string elemen$

    virtual void move(int dir, DungeonLevel & dl);

    virtual void setXLoc(int xToSet);
    virtual int getXLoc();
    virtual void setYLoc(int yToSet);
    virtual int getYLoc();

    virtual int getLevel();
    virtual void setLevel(int levelToSet);
    virtual int getHP();
    virtual void setHP(int HPToSet);
    virtual int getMaxHP();
    virtual void setMaxHP(int maxHPToSet);

private:
    int xLoc;
    int yLoc;
    int level;
    int HP;
    int maxHP;

    // Not worried about inventory yet...
    //std::vector<Item*> m_vInventory;

};

クリーチャー.cpp

#include "Creature.h"
#include <cstdlib>
#include "DungeonLevel.h"

using namespace std;

Creature::Creature(void){
    HP = 0;
    maxHP = 0;
    level = 0;
}


Creature::~Creature(void){

}

void Creature::move(int dir, DungeonLevel & dl){
    //If I take the DungeonLevel & dl param. out.. I don't get errors
}

void Creature::dumpObject(){
    cout << "Creature:" << endl;
    dumpObjectData();
}
//The rest shouldn't be needed

タイル.h

#include "Creature.h"
#include "Item.h"

#include <vector>

class Tile : public Entity {
public:
    Tile(void);
    Tile(char ch);
    virtual ~Tile(void);
    void setCreature(Creature * creatureToSet);
    Creature * getCreature();
    void setDisplayChar(char displayCharToSet);
    char getDisplayChar();

private:
    char displayChar;
    Creature * theCreature;
    std::vector<Item*> inventory;
};

タイル.cpp

#include "Tile.h"
#include "Entity.h"

using namespace std;

Tile::Tile(void){
    displayChar = ' ';
    theCreature = NULL;

}

Tile::Tile(char ch) {
    setDisplayChar(ch);
    theCreature = NULL;
}

Tile::~Tile(void){

}

void Tile::setDisplayChar(char displayCharToSet){
    displayChar = displayCharToSet;
}

char Tile::getDisplayChar(){

    if ( theCreature != NULL ){
            return theCreature->getDisplayChar();
    }
    else {
            return displayChar;
    }
}

void Tile::setCreature(Creature * creatureToSet){
    theCreature = creatureToSet;
}

Creature * Tile::getCreature(){
    return theCreature;
}

Player.h

#include "Creature.h"
#include "Weapon.h"
#include "Armor.h"
#include "DungeonLevel.h"

class Player : public Creature {

public:
    Player(void);
    virtual ~Player(void);

    virtual void dumpObject();
    virtual void dumpObjectData();
    virtual void writeFragment(std::ostream & output);
    virtual void writeDataAsFragment(std::ostream & output);
    virtual void setElementData(std::string elementName, std::string elemen$


    virtual int getScore();
    virtual void setScore(int scoreToSet);
    virtual int getXp();
    virtual void setXp(int xpToSet);

    virtual void setPlayerWeapon(Weapon* playerWeaponToSet);
    virtual Weapon* getPlayerWeapon();
    virtual void setPlayerArmor(Armor* playerArmorToSet);
    virtual Armor* getPlayerArmor();

private:
    //Creature provides level, HP, and maxHP
    int score;
    int xp;
    Weapon * playerWeapon;
    Armor * playerArmor;
};

Player.cpp

#include "Player.h"
#include "Creature.h"

#include <cstdlib>

using namespace std;

Player::Player(void){
    setMaxHP(25);
    setHP(getMaxHP());
    setLevel(1);
    setDisplayChar('o');
    score = 0;
    xp = 0;
}


Player::~Player(void){

}
//the rest shouldn't be needed

助けてください、ありがとう!さらに供給する必要がある場合はお知らせください。ありがとう!

4

2 に答える 2

2

インクルードに循環依存関係があります。DungeonLevel.h には Player.h が含まれ、その逆も同様です。インクルード ガードの性質上、常に一方が他方より前になりますが、小さな変更で順序が入れ替わることがあります。

循環依存関係を削除する必要があります。

于 2013-04-14T04:02:51.710 に答える
1

書かれている@pubbyに追加します。すべてのファイルにインクルード ガードを追加する必要があります。循環依存の問題を回避します。

#ifndef _FILENAME_H_

#define _FILENAME_H_

// ur ファイルのすべてがここに入る

#endif // _FILENAME_H_

ここで、_FILENAME_H_ はヘッダー ファイルの名前です。これにより、循環依存関係がある場合でも、すべてが一度だけ含まれることが保証されます。ただし、循環依存関係は、特定のものを他の前に含める必要がある場合に、他の問題を引き起こす可能性があります。したがって、可能な限り循環依存を避ける必要があります。

于 2013-04-14T04:10:52.503 に答える