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

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;
}

效果

相关文章:

  • 面试题 - Vue 3 如何优化性能?
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter22-处理 XML
  • 【量化-什么是信息?怎么有效的学习?关键字摘取】
  • [KashiCTF 2025] Crypto/Pwn
  • Docker Compose一键部署Spring Boot + Vue项目
  • 微前端 Micro app
  • 数学建模之数学模型—2:非线性规划
  • MySQL 连表查询:原理、语法与优化
  • 005:Cesium.viewer 知识详解、示例代码
  • 小迪安全-24天-文件管理,显示上传,黑白名单,访问控制
  • 【R语言】dplyr包经典函数summarise函数
  • 永洪科技旗下BI产品,成功入选“金融信创优秀解决方案“
  • 模版语法vscode
  • 云计算及其他计算
  • 【LeetCode刷题之路】leetcode155.最小栈
  • Windows 11【1001问】如何下载Windows 11系统镜像
  • 【2025信息安全软考重点考点归纳】实时更新
  • 首发!三维街景数据产品V0.1版发布
  • 网络安全入门|从防护到溯源:HTTP慢速攻击的深度对抗
  • 力扣hot100——二叉树的右视图
  • 消费维权周报丨上周涉汽车类投诉较多,涉加油“跳枪”等问题
  • 交响4K修复版《神女》昨晚上演,观众听到了阮玲玉的声音
  • 打造信息消费新场景、新体验,上海信息消费节开幕
  • 日本一季度实际GDP环比下降0.2%
  • Offer触手可及,2025上海社会组织联合招聘专场活动正寻找发光的你
  • 盛和资源海外找稀土矿提速:拟超7亿元收购匹克,加快推动坦桑尼亚项目