I have a base class, Animal
, and a derived class, Lion
. Animal
has a protected function called eat()
. I would like to call eat()
from a friend function defined in Lion
, but when it won't compile:
error: call to non-static member function without an object argument
Why can't I call a protected function from a friend of Lion
? I have work-arounds, but I can't figure out why a friend wouldn't be able to call eat()
. It doesn't seem to matter if I use Animal::eat
or Lion::eat
, I get the same error. Thoughts?
#include <iostream>
using namespace std;
class Animal{
public:
Animal(int m) : mass(m){}
int getMass() const { return mass; }
protected:
int mass;
void eat(const Animal& lhs, const Animal& rhs, Animal *result){
result->mass = lhs.getMass() + rhs.getMass();
}
};
class Gazelle : public Animal{
public:
Gazelle(int m) : Animal(m){}
};
class Lion : public Animal{
public:
Lion(int m) : Animal(m){}
friend Lion feed(const Lion &lhs, const Gazelle &rhs){
Lion hungry(0);
eat(lhs, rhs, &hungry);
return hungry;
}
};
int main(void){
Lion leo(5);
Gazelle greg(1);
Lion fullLeo = feed(leo, greg);
cout << "Full Leo has mass " << fullLeo.getMass() << endl;
}
A
friend
function is a non member function which has access to private members of a class. But you still have to provide the object details for accessing data members.The usage of
eat
function must be similar toobject_name.eat()
in thefeed
function.