【发布时间】: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 将是函数的第一个和第二个参数的有效且必要的参数。但它们不是用逗号分隔的,这就是传递两个参数的方式。
标签: c++ oop object reference mfc