2017-03-07 29 views
-2

我一直在學習C++只是一段時間到現在(雖然我花了很多時間學習C年前),所以我的問題可能聽起來簡單,有經驗的程序員,但我無法找到答案了嗎。 :我應該如何理解這個函數調用?

我的工作我自己通過sample project,它實現了一個基於客戶端 - 服務器聊天應用程序exaplain的Windows套接字編程。

有用於製造連接請求的服務器等待一個函數調用:

m_Server.Accept(m_Server.m_Client) 

的接受()函數中的CAsyncSocket類中聲明:

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket, 
    SOCKADDR* lpSockAddr = NULL, 
    int* lpSockAddrLen = NULL); 

有沒有單獨的聲明代碼中的Accept()函數將覆蓋此聲明,因此第二個和第三個參數將被假定爲NULL,因爲這些是已定義的默認參數。 (所以我認爲這是不相關的函數聲明爲在此背景下虛擬

的對象m_Server和m_Client是兩種類型的ServerSocket類,從CSocket類派生,它是從CAsyncSocket類派生的(MFC標準類)。現在

,來到我的問題:這兩個對象單獨創建並有它們之間沒有層次關係。那麼我該如何理解函數調用Accept(m_Server.m_Client)?什麼是這種用法點操作的正確的術語表達/這是什麼做的正是在這裏/什麼是在這種情況下產生的m_Server.m_Client具體的參數?

The code can be downloaded from codeproject.com:m_server在ChatServerDlg.h定義和m_Client在ServerSocket.h

定義我會很感激這個解釋。提前致謝。

+2

如果您想告訴我們您從代碼中不能理解的內容,可能會更容易回答。 –

+2

_「在這種情況下m_Server.m_Client產生的具體參數是什麼?」_ m_Server實例中的成員變量m_Client。 –

+0

@πάνταῥεῖ我認爲他說m_Server和m_Client是單獨創建的同一類型ServerSocket的對象。從我所理解的問題來看,「如何用一個參數m_Server **。m_Client?調用函數Accept?」。點表示一個成員,但在這種情況下,m_Client不是成員,而是一個單獨的對象。 c128linux,這是你在問什麼? –

回答

1

我覺得我有回答你的問題。

似乎有物體之間和類CServerSocket它使用完全相同的名稱(CServerSocket :: m_Client)內的成員變量的命名混亂已創建m_Client

我下載你所提到的項目,這是類CServerSocket的定義。

class CServerSocket : public CSocket 
{ 
// Attributes 
public: 

// Operations 
public: 
    CServerSocket(); 
    virtual ~CServerSocket(); 

// Overrides 
public: 

    CDialog * pDlg; 
    CClientSocket m_Client; // <- CONFUSION!!! 
    // ClassWizard generated virtual function overrides 
    //{{AFX_VIRTUAL(CServerSocket) 
    public: 
    virtual void OnAccept(int nErrorCode); 
    //}}AFX_VIRTUAL 

    // Generated message map functions 
    //{{AFX_MSG(CServerSocket) 
     // NOTE - the ClassWizard will add and remove member functions here. 
    //}}AFX_MSG 

// Implementation 
protected: 
}; 

所以,如果我們要在其中創建類型CServerSocket的對象,那麼我們將有機會獲得它的成員m_Client。例如:

CServerSocket m_Server; 
m_Server.m_Client.Send(...args...); 

這很好!然而,你的困惑源自於你創建了另一個CServerSocket類型的對象,叫做m_Client!

CServerSocket m_Client; 
m_Client.m_Client.Send(...args...); 

這還行!奇怪的命名約定,但合法。 所以參數m_Server。m_Client從函數調用接受,使用成員m_Server的m_Client而不是對象m_Client你/或創建的原始代碼的作者。

希望這可以清除它,它是你在哪裏尋找的答案。

+0

是的,這正是我正在尋找的答案,非常感謝!抱歉,如果我很難理解我真正想問什麼。正如你所說,這個樣本項目使用的命名是導致我混淆的主要原因。 – c128linux

相關問題