我一直在学习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中定义
我真的很感激对此的解释。提前谢谢。
答案 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 您/或原始代码的作者。
希望这能清除它,这就是你寻找的答案。