优先队列调用模拟 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::vector
s 不能与 non-copyable/movable classes 一起使用。您只能将 std::vector
与可以复制或移动的 class 一起使用。
您将不得不以某种形式或方式更改您的 class 设计。最简单的更改是 std::unique_ptr
s 或 std::shared_ptr
s 到 Caller
s 的优先级队列,您需要在动态范围内构建它(您还必须提供自定义比较器class for std::priority_queue
,所以它知道如何正确地确定智能指针的优先级,这是一些额外的工作,但是一旦你完全掌握了所有移动的部分,它就不会太复杂了)。 =25=]
我正在研究呼叫中心呼叫队列仿真模型。我创建了一个呼叫者对象向量,并为它们分配了指数分布的随机到达时间间隔,然后在呼叫中心分配了计算到达时间 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::vector
s 不能与 non-copyable/movable classes 一起使用。您只能将 std::vector
与可以复制或移动的 class 一起使用。
您将不得不以某种形式或方式更改您的 class 设计。最简单的更改是 std::unique_ptr
s 或 std::shared_ptr
s 到 Caller
s 的优先级队列,您需要在动态范围内构建它(您还必须提供自定义比较器class for std::priority_queue
,所以它知道如何正确地确定智能指针的优先级,这是一些额外的工作,但是一旦你完全掌握了所有移动的部分,它就不会太复杂了)。 =25=]