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
助けてください、ありがとう!さらに供給する必要がある場合はお知らせください。ありがとう!