#include <iostream> using namespace std; class student { friend class teacher; /* now teacher is a friend of student’s */ private: int id; double gpa; char *name; public: student() { id = 0; gpa = 3.0; name = "null"; } int getid() { return id; } double getgpa() { return gpa; } char* getname() { return name; } void changeid(int newid) { id = newid; } void changegpa(double newgpa) { gpa = newgpa; } void changename(char *newname) { name = newname; } }; class teacher { private: student *students; int size; public: teacher(int num) { students = new student[num]; size = num; } void renewid(); void changegpa(int id, double newgpa); double getgpa(int id); }; void teacher::renewid() { int i; for(i=0; i<size; i++) students[i].id = i; /* accessing student’s private data */ } void teacher::changegpa(int id, double newgpa) { int i; for(i=0; i<size; i++) { if(students[i].id == id) { /* accessing student’s private data: id */ students[i].gpa = newgpa; /* accessing student’s private data */ return; } } } double teacher::getgpa(int id) { int i; for(i=0; i<size; i++) if(students[i].id == id) /* accessing student’s private data: id */ return students[i].gpa; /* accessing student’s private data */ return –1; } int main(){ int i; teacher amr(100); for(i=0; i<100; i++) amr.renewid(); amr.changegpa(50, 3.99); cout << "ID#50 has " << amr.getgpa(50) << " GPA.\n"; return 0; }Here is the program’s output:
ID#50 has 3.5 GPA.As we can see, without declaring teacher to be a friend of student’s, you are not allowed to use the dot notation to access student’s private members. You can comment out the first line inside student and see what happens when you compile. An alternative to being able to use the dot notation to access student’s private members is to simply declare its data members to be public but it is not recommended.
#include <iostream> using namespace std; class student { friend int main(); /* main() is a friend of student’s */ friend void showgpa(student s); /* showgpa() is another friend */ private: int id; double gpa; char *name; public: student() { id = 0; gpa = 3.0; name = "null"; } int getid() { return id; } double getgpa() { return gpa; } char* getname() { return name; } void changeid(int newid) { id = newid; } void changegpa(double newgpa) { gpa = newgpa; } void changename(char *newname) { name = newname; } }; void showgpa(student s) { /* accessing student’s private data: name, gpa */ cout << "The gpa of " << s.name << " is " << s.gpa << ".\n"; } int main() { student mike, john; mike.id = 101; mike.gpa = 3.91; mike.name = "Michael Wen"; /* accessing student’s private data: id, gpa */ cout << mike.name << "'s id is " << mike.id << " and gpa is " << mike.gpa << ".\n"; john.id = 102; john.gpa = 3.95; john.name = "John Wang"; showgpa(john); return 0; }As we can see, both showgpa() and main() can access the private members of student by using the dot notation. To make a function a friend to a class, you need to give the name, the return type, and the parameter types of the function, as the example shows. If you comment out the first two lines inside student and recompile, the compiler will complain.