Skip to content

Latest commit

 

History

History
193 lines (139 loc) · 4.5 KB

File metadata and controls

193 lines (139 loc) · 4.5 KB

Friendship

When we define classes, they can only access their own private members, and do not have access to private members of other classes. However, we may want to allow a class to access private members of another class, we can use the friend keyword to allow this.

class Room {
  private:
    int Length;
    int Width;
    
    // the class House now has access to private members of Room
    friend class House;
    
}

Example: friend class

We demonstrate the use of a friend class in the example below.

#include <iostream>
using namespace std;

class Room {
  private:
    int Length;
    int Width;
    
    // the class House now has access to private members of Room
    friend class House;

  public:
    Room(int len, int wid){
      Length = len;
      Width  = wid;
    }
    
};

class House {
  public: 
    int Area;

    House(Room room){

      // accessing private values
      Area = room.Length * room.Width;
    }


};

int main() {

  Room room(10,7);
  House home(room);
  
  cout << home.Area << "\n";

  return 0;
}
// 70

From the above example, the class House is able to access private data variables of Length and Width for the class Room. This is because House was declared as a friend of Room (friend class House;).

Example: friend function

If we only wanted to give a particular function in one class access to private members of another class, then we can define that specific class function as a friend. The example below illustrates this.

#include <iostream>
using namespace std;

// forward declaration
class Room; 

class House {
  public: 
    int Area;

    void calculateArea(Room);

};

class Room {
  private:
    int Length;
    int Width;

    // the class House now has access to private members of Room
    // friend class House;
    friend void House::calculateArea(Room room);

  public:
    Room(int len, int wid){
      Length = len;
      Width  = wid;
    }

    
};

void House::calculateArea(Room room){
  // accessing private values
  Area = room.Length * room.Width;
}

int main() {

  Room room(10,7);
  
  House home;
  home.calculateArea(room);

  cout << home.Area << "\n";

  return 0;
}
// 70

In the above example, we specify the class function friend void House::calculateArea(Room room) to have access to private members of the class Room.

  • Note that we perform a forward declaration with class Room;, otherwise the compiler will not know what Room is yet when processing the class House which references Room.
  • We also define the function House::calculateArea(Room room) after the class House for the same reason; the compiler will get confused as to what the function is referencing since it hasn't finished compiling the class Room yet.

Example: global friend function

We can also declare a friend function that is globally accessible. In the earlier example House::calculateArea(Room room) is a function that belongs to the class House because we declared that membership with :: notation. If we didn't use that notation, then the calculateArea(Room room) function would be a global function. The example below demonstrates the use of a global friend function.

#include <iostream>
using namespace std;

// forward declaration
class Room; 

class House {
  public: 
    int Area;

    void calculateArea(Room);

};

class Room {
  private:
    int Length;
    int Width;

    // the class House now has access to private members of Room
    // friend class House;
    friend void House::calculateArea(Room room);
    friend int calculateArea(Room room);

  public:
    Room(int len, int wid){
      Length = len;
      Width  = wid;
    }

    
};

void House::calculateArea(Room room){
  // accessing private values
  Area = room.Length * room.Width;
}

// global friend function
int calculateArea(Room room){
  // accessing private values
  int Area = room.Length * room.Width;
  return Area;
}

int main() {

  Room room(10,7);
  House home;
  
  // friend class function
  home.calculateArea(room);
  cout << home.Area << "\n";

  // global friend function
  int Area = calculateArea(room);
  cout << Area << "\n";

  return 0;
}
// 70
// 70

In the above example, we've defined a global function int calculateArea(Room room) {}, which can access private members of class Room through the following declaration: friend int calculateArea(Room room);

References: