C++....................4

news2025/2/25 9:54:11

1.

using namespace std;                 

class mystring {
private:
    char* p;
    int len;

    // 辅助函数:复制字符串
    void copy(const char* source) {
        len = strlen(source);
        p = new char[len + 1];
        strcpy(p, source);
    }

    // 辅助函数:释放内存
    void release() {
        if (p) {
            delete[] p;
        }
    }

public:
    // 构造函数
    mystring(const char* s = "") {
        copy(s);
    }

    // 拷贝构造函数
    mystring(const mystring& other) {
        copy(other.p);
    }

    // 析构函数
    ~mystring() {
        release();
    }

    // 赋值运算符重载
    mystring& operator=(const mystring& other) {
        if (this != &other) {
            release();
            copy(other.p);
        }
        return *this;
    }

    // 加法运算符重载
    mystring operator+(const mystring& other) const {
        char* temp = new char[len + other.len + 1];
        strcpy(temp, p);
        strcat(temp, other.p);
        mystring result(temp);
        delete[] temp;
        return result;
    }

    // 复合赋值运算符重载
    mystring& operator+=(const mystring& other) {
        char* temp = new char[len + other.len + 1];
        strcpy(temp, p);
        strcat(temp, other.p);
        release();
        copy(temp);
        delete[] temp;
        return *this;
    }

    // 下标运算符重载
    char& operator[](int index) {
#include <cstring>
        return p[index];
    }

    // 输出字符串
    void show() const {
        cout << p << endl;
    }
};


int main() {
    mystring str = "hello";
    mystring ptr = "world";
	str.show();
	ptr.show();

    str = str + ptr;
	str.show();

    str += ptr;
	str.show();

    str[0] = 'H';
    str.show();
    return 0;
}

2.

// 定义消息结构体
struct buf{
    long mtype;       // 消息类型,用于区分不同的频道
    char mtext[1024]; // 消息内容
};

// 定义 Channel 类,用于表示消息队列中的特定频道
class Channel {
private:
    int msgid;
    long channel;

public:
    Channel(int id, long ch) : msgid(id), channel(ch) {}

    // 发送消息到指定频道
    void send(const std::string& data) {
        buf message;
        message.mtype = channel;
        strncpy(message.mtext, data.c_str(), sizeof(message.mtext) - 1);
        message.mtext[sizeof(message.mtext) - 1] = '\0';

        if (msgsnd(msgid, &message, strlen(message.mtext) + 1, 0) == -1) {
            perror("msgsnd");
        }
    }

    // 从指定频道读取消息
    std::string read(int size) {
        buf message;
        if (msgrcv(msgid, &message, size, channel, 0) == -1) {
            perror("msgrcv");
            return "";
        }
        return std::string(message.mtext);
    }
};

// 定义 Msg 类,用于封装消息队列的操作
class Msg {
private:
    key_t key;
    int msgid;

public:
    // 构造函数,根据文件名生成消息队列的键值并创建消息队列
    Msg(const std::string& filename) {
        key = ftok(filename.c_str(), 'a');
        if (key == -1) {
            perror("ftok");
        }
        msgid = msgget(key, IPC_CREAT | 0666);
        if (msgid == -1) {
            perror("msgget");
        }
    }

    // 重载 [] 运算符,返回指定频道的 Channel 对象
    Channel operator[](long channel) {
        return Channel(msgid, channel);
    }
};

int main() {
    // 创建 Msg 对象,指定文件名
    Msg m("o.txt");

    // 向 1 号频道发送消息
    m[1].send("Hello, World!");

    // 从 1 号频道读取消息
	std::string str = m[1].read(1024);
	std::cout << "1号频道: " << str << std::endl;

    return 0;
}

3.

class Sem {
private:
    key_t key;
    int id;

    // 辅助函数:执行信号量操作
    void do_semop(int sem_num, int sem_op) {
        struct sembuf sops = {static_cast<unsigned short>(sem_num), static_cast<short>(sem_op), 0};
        if (::semop(id, &sops, 1) == -1) {  // 使用 ::semop 调用系统函数
            throw std::runtime_error("semop failed");
        }
    }

public:
    // 构造函数:创建信号灯集,信号灯集中存在 x 个信号量,并且将所有信号量初始化为 y
    Sem(int num_semaphores, int initial_value) {
        key = ftok(".", 'a');
        if (key == -1) {
            throw std::runtime_error("ftok failed");
        }
        id = semget(key, num_semaphores, IPC_CREAT | 0666);
        if (id == -1) {
            throw std::runtime_error("semget failed");
        }
        for (int i = 0; i < num_semaphores; ++i) {
            if (semctl(id, i, SETVAL, initial_value) == -1) {
                throw std::runtime_error("semctl failed");
            }
        }
    }

    // 手动初始化信号灯集中的第 index 个信号量,初始化成 value
    void init(int index, int value) {
        if (semctl(id, index - 1, SETVAL, value) == -1) {
            throw std::runtime_error("semctl failed");
        }
    }

    // 重载 [] 运算符,返回一个可用于操作信号量的对象
    class SemProxy {
    private:
        Sem& sem;
        int index;
    public:
        SemProxy(Sem& s, int idx) : sem(s), index(idx - 1) {}

        // 重载 + 和 - 运算符,让信号灯集中的第 index 个信号量的值增加或减少
        SemProxy& operator+(int val) {
            sem.do_semop(index, val); 
            return *this;
        }

        SemProxy& operator-(int val) {
            sem.do_semop(index, -val); 
            return *this;
        }
    };

    SemProxy operator[](int index) {
        return SemProxy(*this, index);
    }

    // 析构函数:删除信号灯集
    ~Sem() {
        if (semctl(id, 0, IPC_RMID) == -1) {
            std::cerr << "Warning: semctl IPC_RMID failed" << std::endl;
        }
    }
};

int main() {
    try {
        // 创建信号灯集,包含 2 个信号量,初始值都为 5
        Sem s(2, 5);

        // 手动初始化信号灯集中的第 1 个信号量,初始化成 10
        s.init(1, 10);

        // 让信号灯集中的第 1 个信号量的值 +1
        s[1] + 1;

        // 让信号灯集中的第 1 个信号量的值 -1
        s[1] - 1;

        std::cout << "信号量操作成功" << std::endl;
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }

    return 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304821.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机场导航系统有哪些功能?精准定位与高效路径规划技术深度剖析

本文专为关注机场服务优化、乘客体验提升的IT技术员及航空业同仁而写。将深入探讨机场室内导航系统的核心功能&#xff0c;旨在解决乘客在机场内部定位、路径规划、服务寻找等方面的痛点。如需获取机场导航系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流…

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…

STM32-智能小车项目

项目框图 ST-link接线 实物图&#xff1a; 正面&#xff1a; 反面&#xff1a; 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技&#xff08;688031.SH&#xff09;正式发布DeepSeek全场景解决方案&#xff0c;全面覆盖个人用户、企业客户及行业场景需求&#xff0c;为用户提供从个人到企业、从云端到本地的全方位AI应用支持&#xff0c;为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理

《全星质量管理 QMS 软件系统》&#xff1a;赋能企业高效质量管理 在当今竞争激烈的商业环境中&#xff0c;《全星质量管理 QMS 软件系统》脱颖而出&#xff0c;展现出了显著且无可比拟的应用优势。 首先&#xff0c;《全星质量管理 QMS 软件系统》犹如一张严密的质量管控大网…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

C++Qt学习笔记——实现一个串口通信界面

CQt学习笔记——实现一个串口通信界面 一.界面二、项目结构三、头文件1. 文件头部2. 类定义3. 构造函数和析构函数4. 成员函数5. 成员变量 四、代码解析ReceiveAeraInit 函数解析SerialHelper 构造函数解析1. 为什么有两个 SerialHelper&#xff1f;2. 为什么用 :: 和 :&#x…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后&#xff0c;点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式&#xff0c;可以命名为正文1&#xff0c;因为所有的样式参考的“样式基准…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

【HeadFirst系列之HeadFirstJava】第6天之认识Java的API:解锁高效开发的钥匙

认识Java的API&#xff1a;解锁高效开发的钥匙 在《Head First Java》的第六章节中&#xff0c;作者深入探讨了Java的API&#xff08;Application Programming Interface&#xff09;&#xff0c;并强调了它在Java开发中的重要性。Java API 是Java开发工具包&#xff08;JDK&a…

4 - AXI GPIO按键控制LED实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核&#xff0c;使用中断机制&#xff0c;实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项&#xff1a; AXI GPIO IP核是双沿触发中断&#xff0c;不可设置&…

题海拾贝:扫雷

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Deepseek本地部署小实践(c盘)

目录 前言 一、安装ollama 二、打开终端执行run 三、可视化 前言 小鲸鱼出来以后看到很多大佬本地部署AI&#xff0c;自己也想试一试&#xff0c;第一次部署AI&#xff0c;选了一个简单的办法&#xff0c;实践一下&#xff0c;写得比较粗糙。 一、安装ollama 先简单的介绍…

详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll

运行程序时提示“d3dx9_27.dll文件缺失”&#xff0c;通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决&#xff0c;无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…

【LeetCode刷题之路】leetcode155.最小栈

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Vue全局变量的定义和使用,创建 Store变量、读取、修改

在VUE中&#xff0c;当需要各js、各页面都能读写的全局变量时&#xff0c;可以用store变量&#xff0c;从定义到使用的方法如下 一&#xff0e;定义变量&#xff0c;例&#xff1a;我们定一个全局变量gxh 找到 vue的/ src/ store路径, 在 modules文件夹下创建文件gvar.js 在…

基于Docker的前端环境管理:从开发环境到生产部署的实现方案

# 基于Docker的前端环境管理&#xff1a;从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包为一个容器&#xff0c;提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程&#xff0c;提高…

单片机延时函数怎么写规范?

我们以前在开发产品的时候&#xff0c;肯定会碰到一些延时需求&#xff0c;比如常见的LED闪烁&#xff0c;按键消抖&#xff0c;控制IO口输出时序等等。 别小看延时&#xff0c;这个小问题&#xff0c;想做好&#xff0c;甚至要考虑到程序架构层面。 在开发板上&#xff0c;可能…

数据结构 1-2 线性表的链式存储-链表

1 原理 顺序表的缺点&#xff1a; 插入和删除移动大量元素数组的大小不好控制占用一大段连续的存储空间&#xff0c;造成很多碎片 链表规避了上述顺序表缺点 逻辑上相邻的两个元素在物理位置上不相邻 头结点 L&#xff1a;头指针 头指针&#xff1a;链表中第一个结点的存储…