1. 程式人生 > >C++的“友元類”的一個使用場景

C++的“友元類”的一個使用場景

我遇到了“必須使用友元類”的一個場景。

我遇到了A中有B,B中有A的場景。

貌似“A的一個函式,作為B的友元函式”這個需求無法被實現。

#include <stdlib.h>
class MyApiCls;
class TcpClientCls//用於和Server通訊
{
public:
    TcpClientCls(MyApiCls* pApi) :m_pApi(pApi){}
public:
    void Start(){ HandleUpdateTradingDay("20160308", 9); }//模擬了與Server連線後的情況。
private:
    void HandleUpdateTradingDay(void* pkg, unsigned int len);
private:
    MyApiCls* m_pApi;
};
//inline void TcpClientCls::HandleUpdateTradingDay(void* pkg, unsigned int len)
//{ //放在這裡會報錯。
//    if (m_pApi)
//        m_pApi->m_tradingDay = atoi(reinterpret_cast<char*>(pkg));
//}
class MyApiCls
{
    friend TcpClientCls;//這個友元函式是必須的。
public:
    MyApiCls() :m_tradingDay(0), m_client(this){}
public:
    void Start(){ m_client.Start(); }
private:
    int m_tradingDay;
    TcpClientCls m_client;
};
inline void TcpClientCls::HandleUpdateTradingDay(void* pkg, unsigned int len)
{
    if (m_pApi)
        m_pApi->m_tradingDay = atoi(reinterpret_cast<char*>(pkg));
    /*如果TcpClientCls引用了MyApiCls,而MyApiCls也引用了TcpClientCls,
    那麼,請將它們的"類的宣告"和"成員函式的實現"分成".h"和".cpp"檔案。
    如果都想寫進.h檔案中,那麼請注意某些(比如這個)函式的實現的位置。
    */
}
int main()
{
    MyApiCls api;
    api.Start();
    return 0;
}
完。