C++ C++'&书信电报;类名>;尚未声明';和'&书信电报;类名>;没有字段<;字段名>';错误

C++ C++'&书信电报;类名>;尚未声明';和'&书信电报;类名>;没有字段<;字段名>';错误,c++,C++,我在为课堂做作业,我发现了奇怪的编译错误 错误是:error:“Noble”尚未声明并且错误:类“Warrior”没有任何名为“pBoss”的字段

我在为课堂做作业,我发现了奇怪的编译错误

错误是:
error:“Noble”尚未声明
并且
错误:类“Warrior”没有任何名为“pBoss”的字段

<我是C++新手,所以我真的没有得到我在这里做的错误——我好像声明了类和所有成员字段。
#include <vector>
#include <iostream>
#include <ostream>
using namespace std;

class Warrior {
public:
    Warrior(string name, double str) : name(name), strength(str), pBoss(nullptr) {}
    bool hire(Noble* noble) { }
    bool fire(Noble* noble) { }
    void lost() { }
    void won(double damageRatio) { }
    string getName() const { return name; }
    double getStrength() const { return strength; }
    Noble* getBoss() const { return pBoss; }
    void display(ostream& os = cout) const { }
private:
    string name;
    double strength;
    Noble* pBoss;
};

class Noble {
public:
    Noble(string name) : name(name), alive(true) {}
    bool hire(Warrior& war) { }
    bool fire(Warrior& war) { }
    bool battle(Noble& enemy) { }
    void display(ostream& os = cout) const { }
private:
    vector<Warrior*> army;
    string name;
    double strength;
    bool alive; 
    void lost() { } 
    void won(double damage) { }
};
#包括
#包括
#包括
使用名称空间std;
阶级战士{
公众:
战士(字符串名,双str):名称(name),强度(str),pBoss(nullptr){}
布尔郡(贵族*贵族){}
布尔火(贵族*贵族){}
void lost(){}
void won(双重损害){}
字符串getName()常量{return name;}
double getStrength()常量{返回强度;}
Noble*getBoss()常量{return pBoss;}
无效显示(ostream&os=cout)常量{}
私人:
字符串名;
双倍力量;
Noble*pBoss;
};
贵族阶级{
公众:
Noble(字符串名称):name(名称),alive(true){}
布尔雇佣(战士与战争){}
布尔火(战士与战争){}
布尔战役(贵族与敌人){}
无效显示(ostream&os=cout)常量{}
私人:
矢量军;
字符串名;
双倍力量;
布尔活着;
void lost(){}
无效赢得(双重伤害){}
};

我拿出了功能描述,所以这不会太长,但如果有什么我没有包括,请告诉我,我会更新后

战士
不知道什么是贵族。您需要转发声明
Noble
。将其置于
战士
声明之前:

class Noble;

class Warrior { ...
此外,您在
Warrior
构造函数中拼写错误了
pBoss
,请将构造函数更改为:

Warrior(string name, double str) : name(name), strength(str), pBoss(nullptr) {}

最后,在
显示
声明之后,
Noble
中浮动着一个额外的右括号。

在定义
战士
时,
Noble
尚未定义。C++逐行工作。要解决这个问题,可以向前声明类

// forward declaration
class Warrior;
class Noble;

class Warrior {
  // ...
};

class Noble {
   // ...
};

看起来你的贵族阶级可能会有一个额外的支柱:

class Noble {
public:
    Noble(string name) : name(name), alive(true) {}
    bool hire(Warrior& war) { }
    bool fire(Warrior& war) { }
    bool battle(Noble& enemy) { }
    void display(ostream& os = cout) const { }
    } // <-- out of place?
private:
    vector<Warrior*> army;
    string name;
    double strength;
    bool alive; 
    void lost() { } 
    void won(double damage) { }
};
classnoble{
公众:
Noble(字符串名称):name(名称),alive(true){}
布尔雇佣(战士与战争){}
布尔火(战士与战争){}
布尔战役(贵族与敌人){}
无效显示(ostream&os=cout)常量{}

}//查找转发声明。(提示:
boolhire(Noble*Noble){}
编译器此时不知道
Noble
是什么)它不知道,因为它被称为
pBoss