26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
2015-06-30 08:59
435 查看
26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment
26 BasicUsageEnvironment基本使用环境——Live555源码阅读(三)UsageEnvironment简介以下是其定义
BasicUsageEnvironment的构造与析构
createNew方法(创建对象)
getErrno方法
operator<<方法(输出到strerr)
这是Live555源码阅读的第三部分,包括了UsageEnvironment相关的三个类。
本文由乌合之众 lym瞎编,欢迎转载
blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载
my.oschina.net/oloroso
简介
这个类很简单,它不想basicTaskScheduler那么复杂。没有增加任何成员,仅是实现了基类的几个纯虚方法。以下是其定义
class BasicUsageEnvironment : public BasicUsageEnvironment0 { public: static BasicUsageEnvironment* createNew(TaskScheduler& taskScheduler); // redefined virtual functions: virtual int getErrno() const; // 向 stderr 输出内容。stderr是不带缓冲的 virtual UsageEnvironment& operator<<(char const* str); virtual UsageEnvironment& operator<<(int i); virtual UsageEnvironment& operator<<(unsigned u); virtual UsageEnvironment& operator<<(double d); virtual UsageEnvironment& operator<<(void* p); protected: // 避免直接构造对象,只能通过createNew来创建 BasicUsageEnvironment(TaskScheduler& taskScheduler); // called only by "createNew()" (or subclass constructors) virtual ~BasicUsageEnvironment(); };
BasicUsageEnvironment的构造与析构
注意构造和析构是protected权限的。在创建对象的时候只能使用
createNew方法。
BasicUsageEnvironment的构造函数还是调用了其基类
BasicUsageEnvironment0的带参构造,要注意的是在BasicUsageEnvironment0的构造中又调用了
UsageEnvironment的带参构造。如果是win32平台,其调用了
initializeWinsockIfNecessary进行来初始化
WinSOCK,之后才可以正常使用
WinSOCK相关
API。如果不是windows平台就不需要这么麻烦了,windows网络编程是一件麻烦事。
initializeWinsockIfNecessary函数定义在
live555sourcecontrol\groupsock\inet.c文件中。注意C++中对C函数不能直接调用,要先使用
extern “C”来声明。原因是C和C++编译器对函数名的处理不一致。
#if defined(__WIN32__) || defined(_WIN32) extern "C" int initializeWinsockIfNecessary(); #endif BasicUsageEnvironment::BasicUsageEnvironment(TaskScheduler& taskScheduler) : BasicUsageEnvironment0(taskScheduler) { #if defined(__WIN32__) || defined(_WIN32) if (!initializeWinsockIfNecessary()) { setResultErrMsg("Failed to initialize 'winsock': "); reportBackgroundError(); internalError(); } #endif }BasicUsageEnvironment的析构还是什么也没有做,但是要注意的是,
对象析构的时候会调用基类的析构函数。
顺带再多说一点C++对象的构造析构过程。C++类定义中,构造函数不能使用virtual修饰,而析构函数请尽量使用
virtual修饰。为什么呢?因为将析构函数加入虚函数表可以使得对象在析构的时候可以正确调用对应的析构函数,避免内存泄露等问题。在构建对象的时候,构造函数的调用顺序是
基类的构造—》
派生类的构造,析构顺序与之相反,是
派生类的析构—》
基类的析构。
BasicUsageEnvironment::~BasicUsageEnvironment() { }
createNew方法(创建对象)
在堆上(heap)动态创建一个BasicUsageEnvironment对象并返回对象地址。这是一个静态方法。BasicUsageEnvironment* BasicUsageEnvironment::createNew(TaskScheduler& taskScheduler) { return new BasicUsageEnvironment(taskScheduler); }
getErrno方法
这个方法在BasicUsageEnvironment0中实现setResultErrMsg的时候用到了。其返回一个错误码,在windows相关平台是上一次发生网络错误的错误代码,其他平台是全局的errno。考虑一下errno的线程安全性。int BasicUsageEnvironment::getErrno() const { #if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_WCE) return WSAGetLastError(); /* #include <winsock.h> int PASCAL FAR WSAGetLastError ( void ); 注释:该函数返回上次发生的网络错误.当一特定的Windows Sockets API函数指出一个错误已经发生, 该函数就应调用来获得对应的错误代码. 返回值:返回值指出了该线程进行的上一次Windows Sockets API函数调用时的错误代码. */ #else return errno; #endif }
operator<<方法(输出到strerr)
这几个方法就不说了,还是调用的C的库函数fprintf输出参数内容到
stderr。其实这里可以使用C++面向对象的方法来解决。C++标准库中定义了
std::cerr对象用于将数据发生到标准错误流,其用法和
std::cout可谓是如出一辙。这里重载后使用方法也和
std::cout及其类似,观察其返回值便知了。
UsageEnvironment& BasicUsageEnvironment::operator<<(char const* str) { if (str == NULL) str = "(NULL)"; // sanity check fprintf(stderr, "%s", str); return *this; }
UsageEnvironment& BasicUsageEnvironment::operator<<(int i) { fprintf(stderr, "%d", i); return *this; }
UsageEnvironment& BasicUsageEnvironment::operator<<(unsigned u) { fprintf(stderr, "%u", u); return *this; }
UsageEnvironment& BasicUsageEnvironment::operator<<(double d) { fprintf(stderr, "%f", d); return *this; }
cpp UsageEnvironment& BasicUsageEnvironment::operator<<(void* p) { fprintf(stderr, "%p", p); return *this; }
相关文章推荐
- Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏
- Xamarin.Android开发实践(二)
- 实习日志2----要求分析以及初步面板实现
- linux 内核启动参数
- 编程心得
- [置顶] 文章索引~ Visual C++
- 实验【8】
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
- AngularJS配置xsrftoken(django防止跨站)以及防止与django模板冲突的配置
- cookie设置
- CMD命令大全
- 部署视频聊天系统:网络品质测试
- 23 使用环境 UsageEnvironment——Live555源码阅读
- android edittext+listview进阶 实现搜索listview中的内容 定制自己的过滤器
- Centos6.5关闭防火墙命令
- python面向对象 格式很重要
- 如何只授予用户查看存储过程定义的权限
- OA系统权限管理设计方案
- 基于OSGi的企业级快速开发平台(开源)
- 使用EventHandler传递参数