zoukankan      html  css  js  c++  java
  • 友元函数

    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.
    ", ticketNum);
                if (ticketNum == 0)
                {
                    printf("Tickets has been sold out.
    ");
                    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.
    ", ticketNum);
                if (ticketNum == 0)
                {
                    printf("Tickets has been sold out.
    ");
                    break;
                }
            }
            Sleep(100);
            Mutex.unlock();
        }
    }
    
    
    //函数名称:友元函数售票
    //函数作用:NULL
    //函数参数:NULL
    //函数返回值:NULL
    //函数信息:NULL
    //备注:NULL
    void sell(void* param)
    {
        printf("friend sell.
    ");
        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.
    ");
        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的。使用的时候直接就是当作全局函数使用,把需要访问的对象指针传进去即可

  • 相关阅读:
    驰骋工作流引擎2016年第1次组团培训日程
    CCBPM中流程回滚的介绍
    CCBPM流程变更处理解决方案与对策
    CCBPM多表单流程中关于绑定表单的设计步骤
    CCBPM关于工作流引擎取回审批的设计方案与实现过程
    线程池 -实现线程复用
    线程安全 -同步锁机制
    匿名内部类创建线程,简化线程创建代码
    Thread -线程的两种创建方式
    Throwable -抛出异常类与自定义异常类
  • 原文地址:https://www.cnblogs.com/judes/p/8202602.html
Copyright © 2011-2022 走看看