IP类


#include<iostream>
using namespace std;
class IP
{
private:
    union //由此匿名联合体可以看出,IP地址共占4个字节
    {
        struct //这是一个由4个字节构成的匿名结构体
        {
            unsigned char seg0;
            unsigned char seg1;
            unsigned char seg2;
            unsigned char seg3;
        };  //4字节的IP地址可以看作4部分,每部分1字节
		//unsigned char seg[4];//等于上面四个成员的结构体
        unsigned int address; //4字节的IP地址可以看成一个4字节的整体
    };
public:
    IP(int=0,int=0,int=0,int=0);  //构造函数
    void showIP();  //用四段法显示IP地址
    bool sameSubnet(const IP &ip, const IP &mark);  //判断是否处于同一子网
    char whatKind();  //返回属于哪一类网络
};

IP::IP(int s0,int s1,int s2,int s3)
{
	seg0=s0;
	//seg[0]=s0;//下面都一样
	seg1=s1;
	seg2=s2;
	seg3=s3;
}
void IP::showIP()//四段:分成四部分。
{
	cout<<int(seg0)<<'.'<<int(seg1)<<'.'<<int(seg2)<<'.'<<int(seg3)<<endl;
	//第一次直接写出来是一些问号,因为前面忘记了强制转换类型了,IP地址是数字。
}

char IP::whatKind()
{
	if(seg0<=127)
		return 'A';
		//cout<<'A类'<<endl;//搜了搜百度,得出各类网的范围。
	else if(seg0<=191)
		return 'B';
		//cout<<'B类'<<endl;
	else if(seg0<=223)
		return 'C';
		//cout<<'C类'<<endl;
	else if(seg0<=239)
		return 'D';
		//cout<<'D类'<<endl;
	else
		return 'E';
		//cout<<'E类'<<endl;//开始第一次将这个函数的类型写成了void,所以想着直接在函数类部直接打印出来,改成了char才设定返回值。
}
bool IP::sameSubnet(const IP &ip, const IP &mark)
{
	unsigned int i1,i2;
	i1=address&mark.address;
	i2=ip.address&mark.address;//刚开始打算把四个字节一个一个的&,但是写了好一会儿,但还是没写对,才想到联合体共用一段存储空间,并且以体积最大的成员作为联合体的大小。
//	cout<<i1<<','<<i2<<endl;
//	cout<<true<<','<<false<<endl;
//	cout<<(i1==i2)<<endl;//检测为什么答案不一样。
//	if(i1==12)
//		return true;
//	else
//		return false;//改成这样的话,答案就和最终的不一样了。
	return (i1==i2);	//可是这样又可以
}
int main()
{
    IP ip1(202,194,116,97), ip2(202,194,119,102), mark(255,255,248,0);
    cout<<"ip1: ";
    ip1.showIP();
    cout<<"ip2: ";
    ip2.showIP();
    if(ip1.sameSubnet(ip2,mark))
        cout<<"两个IP在同一子网"<<endl;
    else
        cout<<"两个IP不在同一子网"<<endl;
    cout<<"ip1属于"<<ip1.whatKind()<<"类网络"<<endl;
    return 0;
}

心得:知道IP,但是没有涉及这方面的知识,所以比较困难。包括网络的类型也是在百度搜索才知道,戳这里。联合体也是翻书才知道他的一点点基本的概念,都怪自己上课的时候不认真。在暑假的这些天,能这样还是挺满足的,并没把时间拿来睡懒觉。不过这里最开始的模板是老师的,我只是写出函数来实现功能,如果让我自己设出类,并在其中定义出函数的功能,还是有些怕,因为我不知道某些功能的函数类型到底怎么决定,如果这个没弄好,之后的很多的功能要是接不上程序就会崩溃。

但在这里面还是有个问题没有得到解决;return(i1==i2),改成上面的if....else语句结果就不同了。如果用if....else下面的主函数中的if语句里面的ip1.sameSubnet(ip2,mark)的值就为假了,我把里面的true,false,(i1==i2),ip1.sameSubnet(ip2,mark)全部cout出来都检查它的值只是ip1.sameSubnet(ip2,mark)和预想的不一样,其他的发现值并没有错误,就是结果不一样,可是就不知道错在了哪儿。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值