我应该如何理解这个函数调用?

问题描述:

我一直在学习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,这是你在问什么? –

我觉得我有回答你的问题。

似乎有物体之间和类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