我应该如何理解这个函数调用?
Posted
技术标签:
【中文标题】我应该如何理解这个函数调用?【英文标题】:How should I understand this function call? 【发布时间】:2017-03-07 14:04:35 【问题描述】:直到现在我才学习 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,因为它们是定义的默认参数。 (所以我认为在这种情况下将函数声明为 virtual 并不相关。)
对象m_Server和m_Client都是ServerSocket类的类型,派生自CSocket,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 中定义
我非常感谢对此的解释。提前致谢。
【问题讨论】:
如果您能告诉我们您从该代码中没有特别理解的地方,可能会更容易回答。 "在这种情况下,m_Server.m_Client 产生的具体参数是什么?" 来自m_Server
实例的成员变量m_Client
。
@πάντα ῥεῖ 我想他说 m_Server 和 m_Client 是分别创建的相同类型 ServerSocket 的对象。据我了解,问题是“如何使用参数 m_Server**.**m_Client 调用函数 Accept?”。点表示一个成员,但在这种情况下,m_Client 不是一个成员,而是一个单独的对象。 c128linux,你问的是这个吗?
如果我阅读我的问题,我也猜想答案应该是“来自 m_Server 实例的成员变量 m_Client”(并且想知道为什么有人会问一些如此琐碎的问题)。但是,m_Server 实例没有成员变量 m_Client,正如 Cos 正确指出的那样,我想用我糟糕的英语来表达 m_Client 是一个单独的对象,而是在不同的地方定义的。所以我也猜到了,有两个不同的对象被引用,它们之间似乎没有层次关系。
因此:如果将点运算符放在两个单独的对象之间,结果参数是什么?查看函数的定义,我假设 m_Client 和 m_Server 将是函数的第一个和第二个参数的有效且必要的参数。但它们不是用逗号分隔的,这就是传递两个参数的方式。
【参考方案1】:
我想我已经回答了你的问题。
您创建的对象 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...);
还是可以的!奇怪的命名约定,但合法。 因此,来自函数调用 Accept 的参数 m_Server.m_Client 使用 m_Server 的成员 m_Client 而不是对象m_Client 您/或原始代码的作者创建的。
希望这可以解决问题,这就是您要寻找的答案。
【讨论】:
是的,这正是我正在寻找的答案,非常感谢!抱歉,如果理解我真正想问的内容有点困难。正如你所说,这个示例项目使用的命名是我困惑的主要原因。以上是关于我应该如何理解这个函数调用?的主要内容,如果未能解决你的问题,请参考以下文章