C++ DAY4
作业
代码
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);
//获得id
id=semget(key,num,IPC_CREAT|0666);
//初始化
for(int i=0;i<num;i++)
{
//遍历所有下标 初始化为指定值 index2
semctl(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;
}
效果