作业
代码
class Data
{
private:int a;int b;
public://构造函数Data(int a=0,int b=0):a(a),b(b){}//set接口void setA(int index=0){a=index;}void setB(int index=0){b=index;}//get接口int getA(){return a;}int getB(){return b;}void show(){ cout <<"a = " << a << " , b = " << b << endl; }
};class Data2:public Data
{
public://构造函数Data2(int index=0):Data(index,index){}//set接口void setA(int index=0){ Data::setA(index); Data::setB(index); }void setB(int index=0){ Data::setA(index); Data::setB(index); }//get接口int getA(){return Data::getA();}int getB(){return Data::getB();}
};int main(int argc,const char** argv)
{Data data;data.setA(3);data.setB(4);data.show();Data2 data2;data2.setA(5);data2.setB(6);data2.show();return 0;
}
效果
作业
代码
class Data
{
private:int a;int b;int c;
public://构造函数Data(int a=0,int b=0,int c=0):a(a),b(b),c(c){}//set接口void setA(int index=0){a=index;}void setB(int index=0){b=index;}void setC(int index=0){c=index;}//get接口int getA(){return a;}int getB(){return b;}int getC(){return c;}void show(){ cout << a << " " << b << " " << c << endl; }
};class Data2:public Data
{
public://构造函数Data2(int index=0,int index2=0):Data(index,index,index2){}//set接口void setA(int index=0){ Data::setA(index); Data::setB(index); }void setB(int index=0){ Data::setA(index); Data::setB(index); }void setC(int index=0){ Data::setC(index); }//get接口int getA(){ return Data::getA(); }int getB(){ return Data::getA(); }int getC(){ return Data::getA(); }
};class Data3:public Data2
{
public://构造函数Data3(int index=0):Data2(index,index){}//set接口void setA(int index=0){ Data2::setA(index); Data2::setC(index); }void setB(int index=0){ Data2::setA(index); Data2::setC(index); }void setC(int index=0){ Data2::setA(index); Data2::setC(index); }//get接口int getA(){ return Data2::getA(); }int getB(){ return Data2::getA(); }int getC(){ return Data2::getA(); }
};int main(int argc,const char** argv)
{Data data;data.setA(3);data.setB(4);data.setC(5);data.show();Data2 data2;data2.setA(3);data2.setB(4);data2.setC(5);data2.show();Data3 data3;data3.setA(3);data3.setB(4);data3.setC(5);data3.show();return 0;
}
效果
作业
代码
仅需 在原本的类 中添加成员方法:
// 重载<<Msg& operator<<(const char* index){send(index);return *this;}// 重载<<Msg& operator>>(string& buf){buf=read();return *this;}
效果
作业
代码
等待另一端释放信号量 并 拿走
class Sem
{
private:int index; //记录信号灯集总数int index_op; //将对那个下标操作key_t key;int id;
public:Sem(const int& num,const int& index_value):key(-1),id(-1),index(num),index_op(-1){//如果文件不存在,则创建,不打开open("IPC",O_EXCL|O_CREAT,0666);//生成密钥key=ftok("IPC",2);//获得idid=semget(key,num,IPC_CREAT|0666);//初始化for(int i=0;i<num;i++){//遍历所有下标 初始化为指定值 index2semctl(id,i,SETVAL,index_value);}}//手动设置指定下标的值void init(const int& index){semctl(id,index_op,SETVAL,index);}// 重载[]Sem& operator[](const int& index){//说明选中第 i 个index_op=index;return *this;}//重载 +Sem& operator+(const int& index){struct sembuf sop;sop.sem_num=index_op; //选中下标sop.sem_op=index; //解锁 index 次sop.sem_flg=SEM_UNDO; //自动销毁//执行依次上述设定的操作semop(id,&sop,1);return *this;}//重载 -Sem& operator-(const int& index){struct sembuf sop;sop.sem_num=index_op; //选中下标sop.sem_op=-index; //上锁 index 次sop.sem_flg=SEM_UNDO; //自动销毁//执行依次上述设定的操作semop(id,&sop,1);return *this;}// friend Sem& operator++(Sem& sem);//后自增Sem operator++(int){Sem temp=*this;*this+1;return temp;}// 前自增Sem& operator++(){ *this+1; return *this; }// 后--Sem operator--(int){Sem temp=*this;*this-1;return temp;}// 前--Sem& operator--(){ *this-1; return *this; }
};int main(int argc,const char** argv)
{//创建信号灯集Sem m(5,0);//测试 手动设定 是否正常m[1].init(1);//测试 ++ 是否正常m[1]++;string str[5]={"你","好","世","界"};//测试 -- 是否正常for(int i=0;i<4;i++){--m[1]; //如果 成功拿走信号量cout<<str[i]<<endl; //那么 输出内容}//正常应该输出 "你" "好" 剩下部分由,另一个程序释放信号量后 显示return 0;
}
信号量释放
int main(int argc,const char** argv)
{ while(1){//如果从终端吃到回车while(getchar()!=10);//就向 [频道1] 释放一个信号量m[1]--;//如果从终端吃到回车while(getchar()!=10);//就向 [频道2] 释放一个信号量m[2]--;}return 0;
}
效果