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

时间:2017-03-07 14:04:35

标签: c++ oop object reference mfc

我一直在学习C ++已有一段时间了(虽然我花了很多时间学习C年前),所以对于有经验的程序员来说,我的问题听起来很简单,但我找不到答案。又:

我正在通过sample project工作,它实现了一个基于客户端服务器的聊天应用程序,以便开发Windows套接字编程。

有一个函数调用用于使服务器等待连接请求:

m_Server.Accept(m_Server.m_Client)

Accept()函数在CAsyncSocket类中声明:

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

代码中没有单独的Accept()函数声明,它会覆盖此声明,因此第二个和第三个参数将被假定为NULL,因为这些是已定义的默认参数。 (所以我认为在这种情况下,函数被声明为虚拟是不相关的。)

对象m_Server和m_Client都是ServerSocket类的类型,派生自CSocket,它是从CAsyncSocket(MFC标准类)派生的。

现在,回答我的问题:这两个对象都是分开创建的,它们之间没有层次关系。那么我该如何理解函数调用接受(m_Server.m_Client)?这个点运算符用法的正确术语表达式是什么/它在这里做了什么/在这种情况下由 m_Server.m_Client 产生的具体参数是什么?

The code can be downloaded from codeproject.com:m_server在ChatServerDlg.h中定义,m_Client在ServerSocket.h中定义

我真的很感激对此的解释。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我想我能回答你的问题。

您创建的对象 m_Client 与类 CServerSocket 中的成员变量之间似乎存在命名混淆,该变量使用完全相同的名称( CServerSocket :: 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...);

这很好!然而,您的困惑是由于您创建了另一个名为m_Client的CServerSocket类型的对象!

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

这仍然很好!奇怪的命名惯例,但合法。 因此,函数调用接受中的参数 m_Server.m_Client ,使用 m_Server 的成员 m_Client 而不是对象 m_Client 您/或原始代码的作者。

希望这能清除它,这就是你寻找的答案。