gpt4 book ai didi

c++ - 优先队列调用模拟C++

转载 作者:行者123 更新时间:2023-12-01 14:47:14 27 4
gpt4 key购买 nike

我正在研究调用中心调用队列模拟模型。我创建了一个调用者对象 vector ,并为它们分配了指数分布的随机到达时间,然后在调用中心类中分配了计算的到达时间。我想然后将每个调用者对象复制到 vector 优先级队列中,但是当我将调用者 vector 对象插入队列时,我不断收到此错误:

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;
}
我的 调用中心.h 文件
class CallCenter
{
private:
vector<Caller> callers;
priority_queue<Caller, vector<Caller>, CompareFunction > callQ;


public:
CallCenter();
void queueCalls();
void assignArrivalTime();
我的 调用中心.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 copyablenor movable.


这使得包含此类成员的此类也具有删除的复制构造函数。
毕竟,如果一个类成员不能被默认复制,那么这个类本身也不能被默认复制。
priority_queue<Caller, vector<Caller>, CompareFunction > callQ;
您的优先级队列基于 std::vector .
callQ.push(callers[i]);
std::vector s 不能与不可复制/可移动的类一起使用。您只能使用 std::vector具有可以复制或移动的类。
你将不得不以某种形式或方式改变你的类(class)设计。最简单的更改是优先级队列 std::unique_ptr s 或 std::shared_ptr发送给您的 Caller s,您需要在动态范围内构造它(您还必须为 std::priority_queue 提供一个自定义比较器类,因此它知道如何正确确定智能指针的优先级,这是一些额外的工作,但不是太多一旦你完全掌握了所有移动的部分,就会变得复杂)。

关于c++ - 优先队列调用模拟C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com