11.19c++面向对象+单例模式

编写如下类: class File{ FILE* fp }; 1:构造函数,打开一个指定的文件 2:write函数 向文件中写入数据 3:read函数,从文件中读取数据,以string类型返回

代码实现:

cpp 复制代码
#include <iostream>

using namespace std;

class myfile{
    FILE *fp;
public:
    myfile(const char *path,const char *type);//通过fp绑定一个构造函数
    ~myfile();//通过fp绑定一个析构函数
    int write(char *buf,int signal_size,int terms);//申明一个write函数,向文件中写入数据
    int read(char *buf,int signal_size,int terms);//申请一个read函数,从文件中读取数据,返回string类型
};
myfile::myfile(const char *path,const char *type){
    fp=fopen(path,type);
    if(fp==NULL){
        perror("fopen");
    }
}
myfile::~myfile(){
    fclose(fp);
}
int myfile::write(char *buf,int signal_size,int terms){
    int res=fwrite((char *)buf,signal_size,terms,fp);
    return res;
}
int myfile::read(char *buf,int signal_size, int terms){
    int res=fread((char *)buf,signal_size,terms,fp);
    return res;
}
int main()
{
    myfile file_src={"C:\\Users\\pzctj\\Documents\\81_C++\\day2\\myfile\\main.cpp","r"};
    myfile file_dest={"myfile.txt","w"};
    char str[1024]={0};
   // string buf=str;
    while(1){
        //buf.clear();
       int res=file_src.read((char *)str,1,1024);
        if(res==0){
            cout << "文件读取结束" << endl;
            break;
        }
        file_dest.write((char *)str,1,res);
    }
    return 0;
}

单例模式实现:

懒汉模式:
cpp 复制代码
#include <iostream>

using namespace std;

class signalTon{
private:
    class Mutex{
         pthread_mutex_t mutex;
    public:
        Mutex(){
            pthread_mutex_init(&mutex,NULL);
            cout << "无参互斥锁构造函数" << endl;
        }
        void lock(){
            pthread_mutex_lock(&mutex);
        }
        void unlock(){
            pthread_mutex_unlock(&mutex);
        }
    };
    signalTon(){
        cout << "无参signalTon构造函数" << endl;
    }
    static Mutex mutex;
public:
    signalTon(const signalTon& r)=delete ;//删除自动分配的拷贝构造函数
    //signalTon()=default;//确保必须分配构造函数
    //公开接口,用来调用构造函数,构建唯一对象或者返回唯一对象
    static signalTon* getInstance(){
        mutex.lock();
        static signalTon* instance=NULL;
        if(instance==NULL){
            sleep(1);//延时1秒,对于多线程懒汉模式可能if判断就不起作用,因此引入互斥锁
            instance=new signalTon;//堆区开辟空间并调用构造函数为对象初始化
        }
        mutex.unlock();
        return instance;
    }
};
signalTon::Mutex signalTon::mutex;//静态成员属性mutex开辟空间
void* task(void *arg){
    signalTon* s1=signalTon::getInstance();
    cout << s1 << endl;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,task,NULL);
    pthread_detach(tid);
    signalTon* s1=signalTon::getInstance();
    cout << s1 << endl;
    return 0;
}
饿汉模式:
cpp 复制代码
#include <iostream>

using namespace std;

class signalTon{
private:
    signalTon(){
        cout << "无参signalTon构造函数" << endl;
    }
    static signalTon* instance;
public:
    signalTon(const signalTon& r)=delete ;//删除自动分配的拷贝构造函数
    //signalTon()=default;//确保必须分配构造函数
    //公开接口,用来调用构造函数,构建唯一对象或者返回唯一对象
    static signalTon* getInstance(){
        return instance;
    }
};
signalTon* signalTon::instance=new signalTon;
void* task(void *arg){
    signalTon* s1=signalTon::getInstance();
    cout << s1 << endl;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,task,NULL);
    pthread_detach(tid);
    signalTon* s1=signalTon::getInstance();
    cout << s1 << endl;
    return 0;
}
相关推荐
妙为4 分钟前
unreal engine5.7.4,创建ThirdPerson第三人称模版,类型是c++崩溃
c++·ue5·虚幻·unreal engine5
郝学胜_神的一滴8 分钟前
Qt 高级开发 021:零基础吃透 QVBoxLayout 垂直布局
c++·qt
Boom_Shu30 分钟前
长方形的关系
数据结构·c++·算法
Xin_ye1008644 分钟前
C# 零基础到精通教程 - 第十八章:部署与发布——让应用上线
开发语言·c#
思麟呀1 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
Lumbrologist2 小时前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
码不停蹄的玄黓2 小时前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的2 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪2 小时前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
_童年的回忆_2 小时前
【php】在linux下PHP安装amqp扩展
linux·开发语言·php