友元函数

1、 由于我只遇到了友元函数,实际上还有友元类,共同的友元等。这里只记录友元函数。

2、我是用友元函数类作为C++11的线程入口函数

3、代码,这里以卖票为例子

卖票头文件:

#include <thread>
#include <mutex>
#include <Windows.h>
using namespace std;
class SellTickts
{
public:
    void SellTickts::seller_1();
    void SellTickts::seller_2();
    int ticketNum = 10;
    mutex Mutex;
public:
    SellTickts();
    virtual ~SellTickts();
    friend void sell(void* param);
   friend void sell(void* param,int a);

};

卖票源文件:

 

#include "stdafx.h"
#include "SellTickts.h"


SellTickts::SellTickts()
{

}


SellTickts::~SellTickts()
{

}
//函数名称:售票员1
//函数作用:NULL
//函数参数:NULL
//函数返回值:NULL
//函数信息:NULL
//备注:NULL
void SellTickts::seller_1()
{
    for (;;)
    {
        Mutex.lock();
        if (ticketNum == 0)
        {
            break;
        }
        else
        {

            ticketNum--;
            printf("Seller_1 sold a ticket, remains %d.\n", ticketNum);
            if (ticketNum == 0)
            {
                printf("Tickets has been sold out.\n");
                break;
            }
        }
        Sleep(100);
        Mutex.unlock();
    }
}

//函数名称:售票员2
//函数作用:NULL
//函数参数:NULL
//函数返回值:NULL
//函数信息:NULL
//备注:NULL
void SellTickts::seller_2()
{
    for (;;)
    {
        Mutex.lock();
        if (ticketNum == 0)
        {
            break;
        }
        else
        {

            ticketNum--;
            printf("Seller_2 sold a ticket, remains %d.\n", ticketNum);
            if (ticketNum == 0)
            {
                printf("Tickets has been sold out.\n");
                break;
            }
        }
        Sleep(100);
        Mutex.unlock();
    }
}


//函数名称:友元函数售票
//函数作用:NULL
//函数参数:NULL
//函数返回值:NULL
//函数信息:NULL
//备注:NULL
void sell(void* param)
{
    printf("friend sell.\n");
    SellTickts* pThis = (SellTickts*)param;
    thread thread1(&SellTickts::seller_1, pThis);
    thread thread2(&SellTickts::seller_2, pThis);
    thread1.detach();
    thread2.detach();
}

//函数名称:友元函数售票2个参数
//函数作用:NULL
//函数参数:NULL
//函数返回值:NULL
//函数信息:NULL
//备注:NULL
void sell(void* param,int a)
{
    printf("friend sell with 2 parm.\n");
    SellTickts* pThis = (SellTickts*)param;
    thread thread1(&SellTickts::seller_1, pThis);
    thread thread2(&SellTickts::seller_2, pThis);
    thread1.detach();
    thread2.detach();
}

 

 

 

main函数:

#include "stdafx.h"
#include "SellTickts.h"
int _tmain(int argc, _TCHAR* argv[])
{
    SellTickts sellTickets;
    sell(&sellTickets);
   //sell(&sellTickets,2);//也可以使用这个友元
while (true) { } return 0; }

 4、分析

这是一个多线程卖票的程序,有两个售票员在一直卖票,主要注意的是这里有两个友元函数。虽然网上一直说友元函数不一定是全局函数,但是从上面来看,我认为i就是全局函数。

这里有两个友元函数,名字一样参数不一样,所以是重载的。注意友元函数的核心:一定要有个参数是当前类的指针,因为友元函数本身就是用来访问不相关的类的内部成员,即使是private的。使用的时候直接就是当作全局函数使用,把需要访问的对象指针传进去即可

posted @ 2018-01-05 09:40  朱小勇  阅读(408)  评论(0编辑  收藏  举报