friend
- это спецификатор, который предоставляет конкретной функции или самому классу доступ к ее защищенным, а также закрытым членам и методам:
class SomeFriend;
class SomeClass
{
public:
SomeClass(int a, int b, int c) : a_(a), b_(b), c_(c) {}
virtual ~SomeClass();
private:
int a_, b_, c_;
friend SomeFriend;
};
class SomeFriend
{
public:
virtual ~SomeFriend();
int AddABC(SomeClass& b) { return b.a_ + b.b_ + b.c_; }
};
Чем же тогда отличается от наследования?
friend
членам требуется внешний экземпляр базового класса для доступа к его членамв то время как производный класс уже сам является экземпляром базового класса ...
Что еще можно улучшить в приведенном выше коде?
Вы можете переместить объявлениекласса SomeFriend
выше SomeClass
... и просто выполните:
class SomeClass;
class SomeFriend
{
public:
virtual ~SomeFriend();
int AddABC(SomeClass& b);
};
class SomeClass
{
public:
SomeClass(int a, int b, int c) : a_(a), b_(b), c_(c) {}
virtual ~SomeClass();
private:
int a_, b_, c_;
// Making only the member function 'AddABC' friend of this class...
friend int SomeFriend::AddABC(SomeClass& b);
};
int SomeFriend::AddABC(SomeClass& b)
{
return b.a_ + b.b_ + b.c_;
}
Здесь вы не делаете класс friend
, а выполняете специальную функциюэто требует только своих частных и защищенных членов ...