优先队列调用模拟 C++

Priority Queue Call Simulation C++

我正在研究呼叫中心呼叫队列仿真模型。我创建了一个呼叫者对象向量,并为它们分配了指数分布的随机到达时间间隔,然后在呼叫中心分配了计算到达时间 class。然后我想将每个调用者对象复制到向量优先级队列中,但是当我将调用者向量对象推入队列时,我一直收到此错误:

Error   C2280   'Caller::Caller(const Caller &)': attempting to reference a deleted function    

我已经尝试修复它一段时间了,但似乎无法弄清楚导致问题的原因或解决方法。我正在尝试推送一个已经创建的对象,所以我不确定为什么我会得到对已删除函数的引用。任何帮助将不胜感激。

我的Caller.h文件

#pragma once
#include <random>
#include <time.h>

using namespace std;
class Caller
{
private:
    bool isPaid;
    int priority;
    double arrivalTime;
    double iarrivalTime;
    default_random_engine e1;
    random_device rd1;
public:
    Caller();
    Caller(bool p);
    void setPriority();
    int getPriority();
    void generateInterArrivalTime();
    double getInterArrivalTime();
    void setArrivalTime(double t);
    double getArrivalTime();
    
};

我的Caller.Cpp文件

#include "Caller.h"

Caller::Caller() : isPaid(false), priority(0), iarrivalTime(0), arrivalTime(0)
{

}

Caller::Caller(bool p): isPaid(false), priority(0), iarrivalTime(0)
{
    
    isPaid = p;
}

void Caller::setPriority()
{
    if (isPaid == true)
    {
        priority = 1;
    }
    else(priority = 0);
}

int Caller::getPriority()
{
    return priority;
}

void Caller::generateInterArrivalTime()
{
    e1.seed(rd1());
    exponential_distribution<>callNums(25); 
    iarrivalTime = callNums(e1);
}


double Caller::getInterArrivalTime()
{
    return iarrivalTime;
}

void Caller::setArrivalTime(double t)
{
    arrivalTime = t;
}

double Caller::getArrivalTime()
{
    return arrivalTime;
}

我的CallCenter.h文件

class CallCenter
{
private:
    vector<Caller> callers;
    priority_queue<Caller, vector<Caller>, CompareFunction > callQ;


public:
    CallCenter();
    void queueCalls();
    void assignArrivalTime();

我的CallCenter.Cpp文件

CallCenter::CallCenter(): callers(10)
{

}

void CallCenter::assignArrivalTime()
{   
    for (int i = 0; i < callers.size(); i++)
    {
        callers[i].generateInterArrivalTime();
        
        if (i==0)
        {
            callers[i].setArrivalTime(callers[i].getInterArrivalTime());
            
        }
        else {callers[i].setArrivalTime(callers[i - 1].getArrivalTime() + callers[i].getInterArrivalTime());}
        
        cout << callers[i].getInterArrivalTime() << "\t" << callers[i].getArrivalTime() << endl;
        
    }
}

void CallCenter::queueCalls()
{
    for (int i = 0; i < callers.size(); i++)
    {
        callQ.push(callers[i]);
    }
}

我的CompareFunction.h文件

#pragma once
#include "Caller.h"
class CompareFunction
{
public: bool operator()(Caller& lowp, Caller& highp) 
        {
            return lowp.getArrivalTime() > highp.getArrivalTime();
        }
};
random_device rd1;

您的 class 有一个 std::random_device 作为 class 会员。

std::random_device的拷贝构造函数is deleted:

The copy constructor is deleted: std::random_device is not copyable nor movable.

这使得包含此 class 成员的 class 也有一个已删除的复制构造函数。

毕竟,如果class成员默认无法复制,那么class本身也默认无法复制。

priority_queue<Caller, vector<Caller>, CompareFunction > callQ;

您的优先队列基于std::vector

callQ.push(callers[i]);

std::vectors 不能与 non-copyable/movable classes 一起使用。您只能将 std::vector 与可以复制或移动的 class 一起使用。

您将不得不以某种形式或方式更改您的 class 设计。最简单的更改是 std::unique_ptrs 或 std::shared_ptrs 到 Callers 的优先级队列,您需要在动态范围内构建它(您还必须提供自定义比较器class for std::priority_queue,所以它知道如何正确地确定智能指针的优先级,这是一些额外的工作,但是一旦你完全掌握了所有移动的部分,它就不会太复杂了)。 =25=]