为了账号安全,请及时绑定邮箱和手机立即绑定

关于C++API知识的一些提问。

/ 猿问

关于C++API知识的一些提问。

生生不息的他 2018-10-29 20:36:15


http://img3.mukewang.com/5bd6fe7b000156f706580493.jpghttp://img.mukewang.com/5bd6fe89000104d906580493.jpg
第二幅图里有一句话:客户仍然可以通过该方法返回整型套接字句柄修改类的状态。
这里有几个问题看不懂(#-.-)
第一:结合书上的SocketDisconnect方法不是返回bool型吗?怎么变成返回整型套接字句柄了?
第二:什么是修改类的状态,没听说过啊,各位大仙可以解释下么?而且返回整型套接字句柄怎么修改类的状态啊?
对了还有这样一句话:如果返回指向某个私有成员变量的no-const指针或引用,那也会发生同样内部状态泄露。
也请各位大仙解释一下这句话的意思。
拜托了,真的想不明白,网上也找不到相似的资料。

查看完整描述

3 回答

?
onemoo

你提到的那句话在第一幅图里吧。


对于你的第一问:结合上下文,这句话中的“该方法”指的应该是 GetSocket() 吧。


对于你的第二问:所谓“类的状态”指的就是对象本身具有的那些属性,比如类实例自己的成员变量之类的。

“整型套接字句柄怎么修改类的状态啊?”  显然有其他的方式——比如某些更底层的函数——可以通过套接字句柄来改变套接字的状态。

GetSocket 函数被修饰为 const,这表示设计者并不希望调用这个函数会导致类实例的成员变量(或者说自身的状态)被修改。可是它返回了句柄,可能有其他函数可以通过这一句柄来修改套接字,这就违背了设计者的初衷,所以说这样的设计是糟糕的。


这其实就是最基本的封装细节的面向对象思想。如果你不明白(或者看不懂上面的解释),我觉得你不如再把这些最最基础的面向对象概念好好复习下......    你提的这个问题表现出你还没有完全理解面向对象的思想,可能也没有学明白 C++。

查看完整回答
反对 回复 2018-10-29
?
生生不息的他

图片的顺序放错了,所以问题是:第一幅图里有一句话:客户仍然可以通过该方法返回整型套接字句柄修改类的状态……

查看完整回答
反对 回复 2018-10-29
?
生生不息的他

因为第二幅图看不清楚,我手打程序吧。
#include<string>
#include<cstdef>
#include<sys/socket.h>
#include<unistd.h>

Class URLDownloader
{
public:
URLDownloader();
bool DownloadFile(const std::string&url,
                                const std::strong&localFile);
bool SocketConnect(const std::string&host,int port);
void ScoketDisconnect();
bool IsScoketConnected()const;
int GetScoket()const;
bool SocketWriter(const char*buffer,size_t bytes);
size_t SocketRead(char* buffer,size_t bytes);
bool WriteBufferToFile(char*buffer,const std::string &filename);
private:
int mSocketID;
struct sockaddr_in mServAddr;
bool mIsConnected;
}

查看完整回答
反对 回复 2018-10-29
  • 生生不息的他
    生生不息的他
    图片的顺序放错了,所以问题是:第一幅图里有一句话:客户仍然可以通过该方法返回整型套接字句柄修改类的状态……

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信