定义友元 无法访问基类私有,该如何解决

定义友元 无法访问基类私有
class Monster;
class Actor
{
protected:
string _name;
bool _gender;
public:
Actor(string name,bool gender);
 

friend void Monster::eat(Actor *&food);
};
class Monster:public Actor
 {
private:
string _place;
public:
Monster(string name,bool gender,string place);

void eat(Actor *&food);

 };
void Monster::eat(Actor *&food)
{
cout<<this->_name<<"吃掉"<<food->_name<<"..."<<endl;
delete food;
food=0;
}
(一些和问题无关的我就没贴了)
声明了Monster::eat()函数为友元后提示错误说 1 use of undefined type 'Monster',
  还有food->name也不能访问 2 cannot access protected member declared in class 'Actor'

------解决方案--------------------
这里的友元是不正确而且多余的。

问题在于eat内部的food->_name这里,这里访问的是另一个Actor对象中的_name,是从这个Actor的外部访问它的_name的,但_name的访问权限是protected,因此访问失败,你可能又会问,为什么前面的_name又能访问成功呢?因为访问的是本Monster对象从基类子对象Actor那里继承而来的_name,因此是可以直接访问的。

你的问题只要在Actor中增加一个show_name方法就能解决,例如:

C/C++ code

class Actor
{
    protected:
         string _name;
         bool _gender;
    public:
         Actor( string name, bool gender );
         const string& show_name( ) const { return _name; }

};

class Monster : public Actor
{
    private:
         string _place;

    public:
         Monster( string name, bool gender, string place );

         void eat( Actor* & food );

};

void Monster::eat(Actor *&food)
{
     cout << _name << "吃掉" << food->show_name( ) << "..." << endl;
     delete food;
     food=0;
}

------解决方案--------------------
1. 友元函数不是一个类的成员函数。因此这样的写法friend void Monster::eat(Actor *&food);是不对的。
2. 友元函数没有继承性,就像现实生活中,你父亲的朋友未必是你的朋友一样。