
#include <string>
#include <bitset>
#include <iterator>
#include <iostream>
#include <list>
#include <cstdlib>
#include <fstream>
using namespace std;
class Addr//地址类,4 个分量
{
public:
Addr(string str);//构造函数
Addr(const Addr &address);//拷贝构造函数
//ostream& operator<< (ostream& out,const Addr &object);//向默认输出设备输
出,暂不提供
//Addr& operator= (const Addr& object);//发现会造成内存泄漏,所以先取消掉
他
bool operator== (const Addr& object);
//为了效率,相等操作符只比较整型 IP 地址,不比较 bitset 型
Addr& operator&= (const Addr& object);
void output();//输出 IP 地址
~Addr();
private:
int str_to_int(string str); //这个函数进行字符串到整形数的转换,由于它只是私
有函数,所以函数实现中只进行了基本
///的错误检测,对很多输入错误没有进行检测
inline void set(string str);//把 IP 地址存到对象中,因为效率,这个函数声明为
inline
bitset<8> *bin_addr1, *bin_addr2, *bin_addr3, *bin_addr4;
//这里把 bitset 声明成指针类型是因为标准库中只提供构造时从无符号长整型向二
进制转换
///而初始化静态成员只能在类初始化列表中,这时还没获得用于初始化的字符串 ,
所以只能
///采用动态的内存管理,给理解上造成少许不便
int int_addr1, int_addr2, int_addr3, int_addr4;//整数分别存 IP 地址
};
Addr::Addr(std::string str) { set(str);}
Addr::Addr(const Addr &address)
{
int_addr1 = address.int_addr1;
int_addr2 = address.int_addr2;
int_addr3 = address.int_addr3;
int_addr4 = address.int_addr4;
bin_addr1 = new bitset<8>(*(address.bin_addr1));