当前位置: 首页 > article >正文

C++ 继承与运算符重载的简单练习

 1.长方形的继承类

 

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>

using namespace std;                 

class AB{
private:
	int a;
	int b;
public:
	AB(int a=0,int b=0){}
	void seta(int l){a=l;}
	void setb(int l){b=l;}
	int geta(){return a;}
	int getb(){return b;}
};

class AA:public AB{
	
	public:
		AA(int ab=0,int bc=0)
		:AB(ab,bc){}
		void setA(int a)
		{
			seta(a);
			setb(a);
		}
		void setB(int a)
		{
			seta(a);
			setb(a);
		}

		void show()
		{
			if(geta()==getb())
			{
				cout<<"是正方形"<<endl;
			}else
			{
				cout<<"是长方形"<<endl;
			}
		}
};

int main(int argc,const char** argv){
	
	AA aa;
	aa.setA(4);
	aa.setB(5);
	aa.show();
	return 0;
}

2.三角形继承类的迭代 

 

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>

using namespace std;                 

class ABC{
private:
	int a;
	int b;
	int c;
public:
	ABC(int a=0,int b=0,int c=0){}
	void seta(int l){a=l;}
	void setb(int l){b=l;}
	void setc(int l){c=l;}
	int geta(){return a;}
	int getb(){return b;}
	int getc(){return c;}
};


class AAB:public ABC{
	public:
		AAB(int ab=0,int bc=0,int cd=0)
		:ABC(ab,bc,cd){}
		void setA(int a)
		{
			seta(a);
			setb(a);
		}
		void setB(int a)
		{
			seta(a);
			setb(a);
		}
		void setC(int a)
		{
			seta(a);
			setb(a);
		}
	};


class AAA:public AAB{
	public:
		AAA(int ab=0,int bc=0,int cd=0)
		:AAB(ab,bc,cd){}
		void setA(int a)
		{
			seta(a);
			setb(a);
			setc(a);
		}
		void setB(int a)
		{
			seta(a);
			setb(a);
			setc(a);
		}
		void setC(int a)
		{
			seta(a);
			setb(a);
			setc(a);
		}

		void show()
		{
			cout<<geta()<<endl<<getb()<<endl<<getc()<<endl;

			if(geta()==getb()&&geta()==getc())
			{
				cout<<"是等边三角形"<<endl;
			}else
			{
				cout<<"不是等边三角形"<<endl;
			}
		}
};

int main(int argc,const char** argv){
	
	AAA aaa;
	aaa.AAA::setA(3);
	aaa.AAA::setB(4);
	aaa.AAA::setC(5);
	aaa.AAA::show();
	return 0;
}

 3.使用<<  与  >>运算符的消息队列

 

 queue.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>
#include <sys/ipc.h>
#include <sys/msg.h>

using namespace std; 

struct MessageBuf {
    long mtype;     
    char mtext[128];
};

class Msg{
private:
	long channel;
	MessageBuf buf;
	key_t key;
	int id;
public:
	Msg(const char* filename);
	Msg& operator[](int c);
//	void send(const char* txt);
	friend void operator<<(Msg& buf,const char* txt);
};


Msg::Msg(const char* filename)
{
	key=ftok(filename,1);
	id=msgget(key,IPC_CREAT|0666);
	memset(&buf,0,128);
}


Msg& Msg::operator[](int c)
{
	channel=c;	
	return *this;
}

void operator<<( Msg& m,const char* txt)
{
	m.buf.mtype=m.channel;
	strcpy(m.buf.mtext,txt);
	msgsnd(m.id,&m.buf,sizeof(m.buf.mtext),IPC_NOWAIT);
}


int main(int argc,const char** argv){

while(1)
{
	Msg m("ipc");
	long channel;
	cout<<"请选择频道号: ";
	cin>>channel;
	m[channel]<<"hello world";
}
	return 0;
}

queue_read.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>
#include <sys/ipc.h>
#include <sys/msg.h>

using namespace std;                

struct MessageBuf {
    long mtype;     
    char mtext[128];
};

class Msg{
private:
	long channel;
	MessageBuf buf;
	key_t key;
	int id;
public:
	Msg(const char* filename);
	Msg& operator[](int c);
	friend Msg& operator>>(Msg& m,string& s);
};


Msg::Msg(const char* filename)
{
	key=ftok(filename,1);
	id=msgget(key,IPC_CREAT|0666);
	memset(&buf,0,128);
}


Msg& Msg::operator[](int c)
{
	channel=c;	
	return *this;
}


Msg& operator>>(Msg& m,string& s)
{
	
	m.buf.mtype=m.channel;
	msgrcv(m.id,&m.buf,sizeof(m.buf.mtext),m.channel,IPC_NOWAIT);
	s=m.buf.mtext;
	return m;
}

int main(int argc,const char** argv){
while(1)
{
	Msg m("ipc");
	long channel;
	cout<<"请选择频道号: ";
	cin>>channel;
	string str;
	m[channel]>>str;
	cout<<str<<endl;
}
	
}

 4.运算符重载  ++  --  信号灯集

 

lude <sys/ipc.h>
#include <semaphore.h>
#include <sys/sem.h>

using namespace std;

class Sem{
private:
	key_t key;
	int id;
	int index;
public:
	Sem(const char* filename,int n,int val){
		key = ftok(filename,1);
		id = semget(key,n,IPC_CREAT | 0666);
		for(int i=0;i<n;i++){
			semctl(id,i,SETVAL,val);
		}
	}

	~Sem(){
		semctl(id,0,IPC_RMID);
	}

	friend Sem& operator+(Sem& l,int val);
	friend Sem& operator-(Sem& l,int val);
	Sem& operator[](int index);

	Sem& operator++(int);
	Sem& operator--(int);
};


// Sem s
// s + 1解锁
// s - 1 上锁
// s + 1 + 1 + 1 - 2 - 3
// int(4) + 3
Sem& operator+(Sem& l,int val){
	sembuf buf = {0};
	buf.sem_num = l.index;
	buf.sem_op = abs(val);
	buf.sem_flg = SEM_UNDO;
	semop(l.id,&buf,1);
	return l;
}

Sem& Sem::operator++(int)
{
	sembuf buf = {0};
	buf.sem_num =this->index;
	buf.sem_op = 1;
	buf.sem_flg = SEM_UNDO;
	semop(this->id,&buf,1);
	return *this;
}



/*
	Sem s;
	s[0] - 1  s.index = 0确定好了
*/

Sem& operator-( Sem& l,int val){
    sembuf buf = {0};
    buf.sem_num = l.index;
    buf.sem_op = -abs(val);
    buf.sem_flg = SEM_UNDO;
    semop(l.id,&buf,1); 
	return l;                    
}


Sem& Sem::operator--(int)
{
	sembuf buf = {0};
    buf.sem_num = this->index;
    buf.sem_op = -1;
    buf.sem_flg = SEM_UNDO;
    semop(this->id,&buf,1); 
	return *this; 
}


Sem& Sem::operator[](int index){
	this->index = index;
	return *this;
}


http://www.kler.cn/a/559926.html

相关文章:

  • 爱迪斯通虚拟针灸教学系统入选ARinChina2024 XR行业年度荣誉榜医疗榜单
  • BOOST电路设计
  • 20250212:https通信
  • Directed acyclic graph [DAG]有向无环图 应用场景汇总与知名开源库实现细节说明
  • 【Go】Go wire 依赖注入
  • 面试八股文--数据库基础知识总结(1)
  • 深度学习pytorch之19种优化算法(optimizer)解析
  • 模块化设计的力量:从「乐高积木」看组合式开发如何降低软件工程风险
  • 数据同步的中间件
  • 每日学习Java之一万个为什么
  • 【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用
  • 启动Redis报错记录
  • DeepSeek开源周首日发布FlashMLA,近屿智能助力AI人才启航
  • Keeppalived 实现Nginx 的高可用集群
  • 线程池概念
  • JS高德地图实现降雨降雪效果
  • 网络安全之PHP魔术方法深度解析
  • Python爬虫(四)- Selenium 安装与使用教程
  • jupyterhub on k8s 配置用户名密码 简单版
  • 防漏电保护,塔能物联运维为城市照明安全“上锁”