【问题标题】:Priority Queue Call Simulation C++优先队列调用模拟 C++
【发布时间】:2020-11-16 06:29:50
【问题描述】:

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

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();
        }
};

【问题讨论】:

    标签: c++ header-files priority-queue


    【解决方案1】:
    random_device rd1;
    

    您的班级有 std::random_device 作为班级成员。

    std::random_device的复制构造函数is deleted

    复制构造函数被删除:std::random_device 不可复制 也不能移动。

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

    毕竟,如果一个类的成员默认不能复制,那么这个类本身也默认不能复制。

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

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

    callQ.push(callers[i]);
    

    std::vectors 不能与不可复制/可移动的类一起使用。您只能将std::vector 与可复制或移动的类一起使用。

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

    【讨论】:

    • 哦,好吧,这是有道理的。我是否也可以通过另一种方式播种默认随机引擎而不是使用随机设备来避免此问题?
    • 使用多个随机数引擎并没有太大的好处,一个全局随机数引擎就足够了。这可能不是唯一的问题。默认随机引擎也是实现定义的,可能不可复制。
    • std::random_device 可以是静态成员。
    • 使 std::random_device 静态似乎可行!还接受了 Sam 关于使用一个引擎的建议。
    猜你喜欢
    • 2013-03-06
    • 2010-12-28
    • 2012-03-28
    • 1970-01-01
    • 2022-01-07
    • 2013-08-21
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多