C ++ object-oriented -11- friend

This knowledge to learn a new point: a friend. Living in your home has a living room and bedroom, the living room is all guests can go in, but the bedroom is private, in the program, the living room is a public authority, the bedroom is a private authority. However, there are some special, in the program, is defined as some private property, but also want some special functions outside the class or classes to access, it is necessary to use techniques friend.

Friend's aim is to make a function or class can access private members of another class, the keyword friend friend

Three kinds of friendship are achieved

  • Global functions do friend
  • Class to do a friend
  • Member functions do friend

1. global functions do friend

The following code represents a good base of Friends come to your home, visit your living room, of course, no problem, the living room is public property.

#include <iostream>
#include <string>
using namespace std;

class Building
{

public:

    Building() //构造函数
    {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }
public:
    string m_SittingRoom;// 客厅
private:
    string m_BedRoom;// 卧室
};

//全局函数
void goodGay(Building *building)
{
    cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;
}

void test01()
{
    Building building;
    goodGay(&building);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

If you want a good base Friends can access your bedroom, we need to do

#include <iostream>
#include <string>
using namespace std;

class Building
{
    friend void goodGay(Building *building);
public:

    Building() //构造函数
    {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }
public:
    string m_SittingRoom;// 客厅
private:
    string m_BedRoom;// 卧室
};

//全局函数
void goodGay(Building *building)
{
    cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl;
    cout << "好基友全局函数 正在访问:" << building->m_BedRoom << endl;
}

void test01()
{
    Building building;
    goodGay(&building);
}

int main()
{
    test01();
    system("pause");
    return 0;
}

Is to declare global functions in the class inside the front position, and use the keyword friend, told the class, global function goodGay is a good friend of the current class, you can access to private property: bedroom

 

2. Class do friend

Class friend to do is to make a class A class B can access the private members.

Let's write two classes, then take a look at the code to access the second class public property.

#include <iostream>
#include<string>
using namespace std;

class Building
{

public:
    string m_SittingRoom;
private:
    string  m_BedRoom;

public:
    Building()
    {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }

};

class GoodGay
{

public:
    Building * building;
    
    GoodGay()
    {
        building = new Building();
    }

    void visit()
    {
        cout << "好基友类 正在访问: " << building->m_SittingRoom << endl;
        //cout << "好基友类 正在访问: " << building->m_BedRoom << endl;
    }

};

void test01()
{
    GoodGay gGay;
    gGay.visit();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

You can print out the run is: based Friends of classes is available: living room

Then tell a friend Building category, based Friends Building class is the class of friends.

#include <iostream>
#include<string>
using namespace std;

class Building
{
    friend class GoodGay;
public:
    string m_SittingRoom;
private:
    string  m_BedRoom;

public:
    Building()
    {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }

};

class GoodGay
{

public:
    Building * building;
    
    GoodGay()
    {
        building = new Building();
    }

    void visit()
    {
        cout << "好基友类 正在访问: " << building->m_SittingRoom << endl;
        cout << "好基友类 正在访问: " << building->m_BedRoom << endl;
    }

};

void test01()
{
    GoodGay gGay;
    gGay.visit();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

After such changes, you can make a good base Friends of the class access to private property.

 

3. member functions do friend

With the above basis, direct look at the code

#include <iostream>
#include<string>
using namespace std;

class Building;  // 先声明
class GoodGay
{

public:
    Building * building;

    GoodGay()
    {
        building = new Building;
    }

    void visit()
    {
        cout << "visit() 正在访问: " << building->m_SittingRoom << endl;
        cout << "visit() 正在访问: " << building->m_BedRoom << endl;
    }

    void visit2()
    {
        cout << "visit2() 正在访问: " << building->m_SittingRoom << endl;
        //cout << "visit2() 正在访问: " << building->m_BedRoom << endl;
    }

};

class Building
{
    //告诉编译器 GoodGay下的成员函数visit()是好朋友,能访问私有属性
    friend void GoodGay::visit();

public:
    string m_SittingRoom;
private:
    string  m_BedRoom;

public:
    Building()
    {
        m_SittingRoom = "客厅";
        m_BedRoom = "卧室";
    }

};

void test01()
{
    GoodGay gg;
    gg.visit();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

This code will complain, suggesting that this class does not define Building, very strange, naming definition, but also puts Building declaration code statements brought to the front GoodGay class, or will be out of the question.

The pit should be noted that, when writing a member function to do friend, statements and realize the need for separate functions to write, and write back specific implementation must be written in class.

#include <iostream>
#include<string>
using namespace std;

class Building;

class GoodGay
{
public:
   
    GoodGay();  //构造函数
    void visit(); //只写声明
    void visit2(); // 只写声明
    Building * building;
};

class Building
{
    //告诉编译器 GoodGay下的成员函数visit()是好朋友,能访问私有属性
    friend void GoodGay::visit();
public:
    Building(); //构造函数

    string m_SittingRoom;
private:
    string  m_BedRoom;

};

GoodGay::GoodGay()
{
    building = new Building;
}

void GoodGay::visit()
{
    cout << "visit() 正在访问: " << building->m_SittingRoom << endl;
    cout << "visi() 正在访问: " << building->m_BedRoom << endl;
}

void GoodGay::visit2()
{
    cout << "visit2() 正在访问: " << building->m_SittingRoom << endl;
    //cout << "visi2() 正在访问: " << building->m_BedRoom << endl;
}

Building::Building()
{
    m_SittingRoom = "客厅";
    m_BedRoom = "卧室";
}

void test01()
{
    GoodGay gg;
    gg.visit();
}

int main()
{
    test01();
    system("pause");
    return 0;
}

My function-based Friends of the visit () concrete implementation must be written in the back of Building this class, if not carefully written on the top of the class, it has been reported Building class undefined reference error.

 

发布了1010 篇原创文章 · 获赞 2055 · 访问量 335万+

Guess you like

Origin blog.csdn.net/u011541946/article/details/104109286