一起写服务器(C++/线程池/多反应堆(类介绍上))
用C++重构服务器,用了C++的知识点和一些C++ 11标准
1.Channel类
1.1枚举类
//定义文件描述符的读写事件
//知识点,强枚举
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
“传统”的C++枚举类型有一些缺点:它会在一个代码区间中抛出枚举类型成员
(如果在相同的代码域中的两个枚举类型具有相同名字的枚举成员,
这会导致命名冲突),它们会被隐式转换为整型,并且不可以指定枚举的底层数据类型
C++11中,强类型枚举解决了这些问题
举例:
int main()
{
enum Status
{
Ok,
Error
};
//enum Status2{Ok, Error};//err, 导致命名冲突, Status已经有成员叫Ok, Error
return 0;
}
enum class FDEvent { TimeOut = 0x01, ReadEvent = 0x02, WriteEvent = 0x04 };
枚举类的使用
m_events |= (int)FDEvent::WriteEvent; m_events |= static_cast<int>(FDEvent::WriteEvent); /* 知识点:1.枚举作用域 2.上面是C语言风格的强制类型转换,下面是C++风格的强制类型转换,强制转换成int类型 */
2.ChannelMap类
C++的STL里面提供了MAP容器,而且其会动态扩容,所以我们不再需要这个类了,直接清除
3.Dispatcher类(父)
首先我们可以了解一下C++的三大特性
封装性:
把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
类将成员变量和成员函数封装在类的内部,根据需要设置访问权限,通过成员函数管理内部状态
3.1protected
其中子类需要从父类继承过来数据,所以需要变成protected,而public这个类可以随便访问,但是同样我们需要访问参数怎么办?就用函数返回一个参数,让调用的类访问。
3.2默认参数
int timeout = 2//就是默认参数
3.3虚析构
实现多态时,父指针指向子指针,所以要变成虚析构,因为本来继承后要重写
实例化的是子类对象,所以需要子对象重写析构函数,以便在销毁时释放资源
3.4 虚函数和纯虚函数:
虚函数:C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。但是此时子类也可以重写父类的虚函数实现子类的特殊化。(可以重写,也可以不用重写,已经为子类提供了默认的函数实现)
纯虚函数:C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,子函数必须要对它进行重写
(子类必须重写父类的函数)
虚函数和纯虚函数的举例:
虚函数:virtual int add(); //而且得实现这个功能
纯虚函数:virtual int add() = 0;
3.5
冒号后面跟的是赋值,这种写法是C++的特性。
A( int aa, int bb ):a(aa),b(bb)
{
}
相当于
A( int aa, int bb )
{
a=aa;
b=bb;
}
继承:
继承所表达的是类之间相关的关系,这种关系使得对象可以继承另外一类对象的特征和能力。 继承的作用:避免公用代码的重复开发,减少代码和数据冗余。
//一般公共继承就行,继承了父类的东西,但是父类的private里面的东西继承不了,所以把父类的数据改成protected
4.EpollDispatcher/SelectDispatcher/PollDispatcher类(子)
多态:
多态性可以简单地概括为“一个接口,多种方法”,字面意思为多种形态。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。比如函数重载、运算符重载、虚函数等
Dispatcher类的dispatch:
EpollDispatcher类的dispatch:
SelectDispatcher类的dispatch: