定义友元 无法访问基类私有,该如何解决
定义友元 无法访问基类私有
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方法就能解决,例如:
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. 友元函数没有继承性,就像现实生活中,你父亲的朋友未必是你的朋友一样。