编译问题。错误E0413,E0434,C2664,C2440

我从我们的课程资料中获得了此源代码,但无法正常工作。该程序是一个飞行模拟器。该链接可能有助于了解更大的概况。从第67页开始。http://brahms.emu.edu.tr/rza/tr3.pdf

这些是Visual Studio给我的错误。

错误E0413不存在从“常量平面”到“常量Queue_entry”的合适转换函数。 Runaway.cpp第32和57行

错误E0413不存在从“扩展队列”到“跑道活动”的合适转换功能。 Runaway.cpp第85和93行

错误E0434无法使用类型“ Plane”的值初始化类型为“ Queue_entry&”的引用(非const限定)。 Runaway.cpp第96行。

错误C2664'错误代码队列:: append(const Queue_entry&)':无法将参数1从'const Plane'转换为'const Queue_entry&'。 Runaway.cpp第32和57行

错误C2664'错误代码队列:: retrieve(Queue_entry&)const':无法将参数1从'Plane'转换为'Queue_entry&'。 Runaway.cpp第85和93行

错误C2440'=':无法从'Extended_queue'转换为'Runway_activity'。 Runaway.cpp第96行。

Runaway.h

#include "Utility.h"
#include "Extended_queue.h"
#include "Plane.h"

enum Runway_activity { idle,land,takeoff };

class Runway {
public:
    Runway(int limit);
    Error_code can_land(const Plane& current);
    Error_code can_depart(const Plane& current);
    Runway_activity activity(int time,Plane& moving);
    void shut_down(int time) const;

private:
    Extended_queue landing;
    Extended_queue takeoff;
    int queue_limit;
    int num_land_requests;        //  number of planes asking to land
    int num_takeoff_requests;     //  number of planes asking to take off
    int num_landings;             //  number of planes that have landed
    int num_takeoffs;             //  number of planes that have taken off
    int num_land_accepted;        //  number of planes queued to land
    int num_takeoff_accepted;     //  number of planes queued to take off
    int num_land_refused;         //  number of landing planes refused
    int num_takeoff_refused;      //  number of departing planes refused
    int land_wait;                //  total time of planes waiting to land
    int takeoff_wait;             //  total time of planes waiting to take off
    int idle_time;                //  total time runway is idle
};

Runaway.cpp

#include "Runway.h"
#include <iostream>
using namespace std;

Runway::Runway(int limit)
/*
Post:  The Runway data members are initialized to record no
       prior Runway use and to record the limit on queue sizes.
*/

{
    queue_limit = limit;
    num_land_requests = num_takeoff_requests = 0;
    num_landings = num_takeoffs = 0;
    num_land_refused = num_takeoff_refused = 0;
    num_land_accepted = num_takeoff_accepted = 0;
    land_wait = takeoff_wait = idle_time = 0;
}


Error_code Runway::can_land(const Plane& current)
/*
Post:  If possible,the Plane current is added to the
       landing Queue; otherwise,an Error_code of overflow is
       returned. The Runway statistics are updated.
Uses:  class Extended_queue.
*/

{
    Error_code result;
    if (landing.size() < queue_limit)
        result = landing.append(current);
    else
        result = fail;
    num_land_requests++;

    if (result != success)
        num_land_refused++;
    else
        num_land_accepted++;

    return result;
}


Error_code Runway::can_depart(const Plane& current)
/*
Post:  If possible,the Plane current is added to the
       takeoff Queue; otherwise,an Error_code of overflow is
       returned. The Runway statistics are updated.
Uses:  class Extended_queue.
*/

{
    Error_code result;
    if (takeoff.size() < queue_limit)
        result = takeoff.append(current);
    else
        result = fail;
    num_takeoff_requests++;
    if (result != success)
        num_takeoff_refused++;
    else
        num_takeoff_accepted++;

    return result;
}


Runway_activity Runway::activity(int time,Plane& moving)
/*
Post:  If the landing Queue has entries,its front
       Plane is copied to the parameter moving
       and a result  land is returned. Otherwise,if the takeoff Queue has entries,its front
       Plane is copied to the parameter moving
       and a result  takeoff is returned. Otherwise,idle is returned. Runway statistics are updated.
Uses:  class Extended_queue.
*/

{
    Runway_activity in_progress;
    if (!landing.empty()) {
        landing.retrieve(moving);
        land_wait += time - moving.started();
        num_landings++;
        in_progress = land;
        landing.serve();
    }

    else if (!takeoff.empty()) {
        takeoff.retrieve(moving);
        takeoff_wait += time - moving.started();
        num_takeoffs++;
        in_progress = takeoff;
        takeoff.serve();
    }

    else {
        idle_time++;
        in_progress = idle;
    }
    return in_progress;
}

void Runway::shut_down(int time) const
/*
Post: Runway usage statistics are summarized and printed.
*/

{
    cout << "Simulation has concluded after " << time << " time units." << endl
        << "Total number of planes processed "
        << (num_land_requests + num_takeoff_requests) << endl
        << "Total number of planes asking to land "
        << num_land_requests << endl
        << "Total number of planes asking to take off "
        << num_takeoff_requests << endl
        << "Total number of planes accepted for landing "
        << num_land_accepted << endl
        << "Total number of planes accepted for takeoff "
        << num_takeoff_accepted << endl
        << "Total number of planes refused for landing "
        << num_land_refused << endl
        << "Total number of planes refused for takeoff "
        << num_takeoff_refused << endl
        << "Total number of planes that landed "
        << num_landings << endl
        << "Total number of planes that took off "
        << num_takeoffs << endl
        << "Total number of planes left in landing queue "
        << landing.size() << endl
        << "Total number of planes left in takeoff queue "
        << takeoff.size() << endl;
    cout << "Percentage of time runway idle "
        << 100.0 * ((float)idle_time) / ((float)time) << "%" << endl;
    cout << "Average wait in landing queue "
        << ((float)land_wait) / ((float)num_landings) << " time units";
    cout << endl << "Average wait in takeoff queue "
        << ((float)takeoff_wait) / ((float)num_takeoffs)
        << " time units" << endl;
    cout << "Average observed rate of planes wanting to land "
        << ((float)num_land_requests) / ((float)time)
        << " per time unit" << endl;
    cout << "Average observed rate of planes wanting to take off "
        << ((float)num_takeoff_requests) / ((float)time)
        << " per time unit" << endl;
}

Plane.h

#pragma once
#include "Utility.h"

enum Plane_status { null,arriving,departing };

class Plane {
public:
    Plane();
    Plane(int flt,int time,Plane_status status);
    void refuse() const;
    void land(int time) const;
    void fly(int time) const;
    int started() const;

private:
    int flt_num;
    int clock_start;
    Plane_status state;
};

Plane.cpp

#include "Plane.h"
#include <iostream>
using namespace std;

Plane::Plane(int flt,Plane_status status)
/*
Post:  The Plane data members flt_num,clock_start,and state are set to the values of the parameters flt,time and status,respectively.
*/

{
    flt_num = flt;
    clock_start = time;
    state = status;
    cout << "Plane number " << flt << " ready to ";
    if (status == arriving)
        cout << "land." << endl;
    else
        cout << "take off." << endl;
}


Plane::Plane()
/*
Post:  The Plane data members flt_num,state are set to illegal default values.
*/
{
    flt_num = -1;
    clock_start = -1;
    state = null;
}


void Plane::refuse() const
/*
Post: Processes a Plane wanting to use Runway,when
      the Queue is full.
*/

{
    cout << "Plane number " << flt_num;
    if (state == arriving)
        cout << " directed to another airport" << endl;
    else
        cout << " told to try to takeoff again later" << endl;
}


void Plane::land(int time) const
/*
Post: Processes a Plane that is landing at the specified time.
*/

{
    int wait = time - clock_start;
    cout << time << ": Plane number " << flt_num << " landed after "
        << wait << " time unit" << ((wait == 1) ? "" : "s")
        << " in the takeoff queue." << endl;
}


void Plane::fly(int time) const
/*
Post: Process a Plane that is taking off at the specified time.
*/

{
    int wait = time - clock_start;
    cout << time << ": Plane number " << flt_num << " took off after "
        << wait << " time unit" << ((wait == 1) ? "" : "s")
        << " in the takeoff queue." << endl;
}


int Plane::started() const
/*
Post: Return the time that the Plane entered the airport system.
*/
{
    return clock_start;
}

Extended_queue.h

#pragma once
#include "Queue.h"

class Extended_queue : public Queue {
public:
    bool full() const;
    int size() const;
    void clear();
    Error_code serve_and_retrieve(Queue_entry& item);

    void print();
};

Extended_queue.cpp

#include "Extended_queue.h"

int Extended_queue::size() const
/*
Post:   Return the number of entries in the Extended_queue.
*/
{
    return count;
}

bool Extended_queue::full() const
{
    return maxqueue == this->count;
}

void Extended_queue::clear()
{
    this->count = 0;
    this->front = 0;
    this->rear = maxqueue - 1;
}

Error_code Extended_queue::serve_and_retrieve(Queue_entry& item)
{
    if (count <= 0) return underflow;
    item = entry[front];
    count--;
    front = ((front + 1) == maxqueue) ? 0 : (front + 1);
    return success;
}

void Extended_queue::print()
{
    for (int i = 0,j = front;
        i < this->count; i++,j = ((j + 1) == maxqueue) ? 0 : (j + 1))
        cout << this->entry[j] << ' ';

    cout << endl;

}

Queue.h

#include "Utility.h"

typedef char Queue_entry;

const int maxqueue = 1000; //  small value for testing

class Queue {
public:
    Queue();
    bool empty() const;
    Error_code serve();
    Error_code append(const Queue_entry& item);
    Error_code retrieve(Queue_entry& item) const;

protected:
    int count;
    int front,rear;
    Queue_entry entry[maxqueue];
};

Queue.cpp

#include "Queue.h"

Queue::Queue()
/*
Post: The Queue is initialized to be empty.
*/
{
    count = 0;
    rear = maxqueue - 1;
    front = 0;
}


bool Queue::empty() const
/*
Post: Return true if the Queue is empty,otherwise return false.
*/
{
    return count == 0;
}


Error_code Queue::append(const Queue_entry& item)
/*
Post: item is added to the rear of the Queue. If the Queue is full
return an Error_code of overflow and leave the Queue unchanged.
*/

{
    if (count >= maxqueue) return overflow;
    count++;
    rear = ((rear + 1) == maxqueue) ? 0 : (rear + 1);
    entry[rear] = item;
    return success;
}


Error_code Queue::serve()
/*
Post: The front of the Queue is removed. If the Queue
is empty return an Error_code of underflow.
*/

{
    if (count <= 0) return underflow;
    count--;
    front = ((front + 1) == maxqueue) ? 0 : (front + 1);
    return success;
}


Error_code Queue::retrieve(Queue_entry& item) const
/*
Post: The front of the Queue retrieved to the output
      parameter item. If the Queue is empty return an Error_code of underflow.
*/

{
    if (count <= 0) return underflow;
    item = entry[front];
    return success;
}

Utility.h

#pragma once

#include <iostream> 
using namespace std;

enum Error_code {
    success,fail,utility_range_error,underflow,overflow,fatal,not_present,duplicate_error,entry_inserted,entry_found,internal_error
};

bool user_says_yes();

Utility.cpp

#include "Utility.h"
#include <iostream>
using namespace std;

bool user_says_yes()
{
    int c;
    bool initial_response = true;

    do {  //  Loop until an appropriate input is received.
        if (initial_response)
            cout << " (y,n)? " << flush;

        else
            cout << "Respond with either y or n: " << flush;

        do { //  Ignore white space.
            c = cin.get();
        } while (c == '\n' || c == ' ' || c == '\t');
        initial_response = false;
    } while (c != 'y' && c != 'Y' && c != 'n' && c != 'N');
    return (c == 'y' || c == 'Y');
}

Main.cpp

#include "Random.h"
#include "Plane.h"
#include "Runway.h"
#include "Utility.h"
#include <iostream>
using namespace std;

void run_idle(int time)
/*
Post: The specified time is printed with a message that the runway is idle.
*/
{
    cout << time << ": Runway is idle." << endl;
}


void initialize(int& end_time,int& queue_limit,double& arrival_rate,double& departure_rate)
    /*
    Pre:  The user specifies the number of time units in the simulation,the maximal queue sizes permitted,and the expected arrival and departure rates for the airport.
    Post: The program prints instructions and initializes the parameters
          end_time,queue_limit,arrival_rate,and departure_rate to
          the specified values.
    Uses: utility function user_says_yes
    */

{
    cout << "This program simulates an airport with only one runway." << endl
        << "One plane can land or depart in each unit of time." << endl;
    cout << "Up to what number of planes can be waiting to land "
        << "or take off at any time? " << flush;
    cin >> queue_limit;

    cout << "How many units of time will the simulation run?" << flush;
    cin >> end_time;

    bool acceptable;
    do {
        cout << "Expected number of arrivals per unit time?" << flush;
        cin >> arrival_rate;
        cout << "Expected number of departures per unit time?" << flush;
        cin >> departure_rate;
        if (arrival_rate < 0.0 || departure_rate < 0.0)
            cerr << "These rates must be nonnegative." << endl;
        else
            acceptable = true;

        if (acceptable && arrival_rate + departure_rate > 1.0)
            cerr << "Safety Warning: This airport will become saturated. " << endl;

    } while (!acceptable);
}


int main()
    //  Airport simulation program
/*
Pre:  The user must supply the number of time intervals the simulation is to
      run,the expected number of planes arriving,the expected number
      of planes departing per time interval,and the
      maximum allowed size for runway queues.
Post: The program performs a random simulation of the airport,showing
      the status of the runway at each time interval,and prints out a
      summary of airport operation at the conclusion.
Uses: Classes Runway,Plane,Random and functions run_idle,initialize.
*/

{
    int end_time;            //  time to run simulation
    int queue_limit;         //  size of Runway queues
    int flight_number = 0;
    double arrival_rate,departure_rate;
    initialize(end_time,departure_rate);
    Random variable;
    Runway small_airport(queue_limit);
    for (int current_time = 0; current_time < end_time; current_time++) { //  loop over time intervals
        int number_arrivals = variable.poisson(arrival_rate);  //  current arrival requests
        for (int i = 0; i < number_arrivals; i++) {
            Plane current_plane(flight_number++,current_time,arriving);
            if (small_airport.can_land(current_plane) != success)
                current_plane.refuse();
        }

        int number_departures = variable.poisson(departure_rate); //  current departure requests
        for (int j = 0; j < number_departures; j++) {
            Plane current_plane(flight_number++,departing);
            if (small_airport.can_depart(current_plane) != success)
                current_plane.refuse();
        }

        Plane moving_plane;
        switch (small_airport.activity(current_time,moving_plane)) {
            //  Let at most one Plane onto the Runway at current_time.
        case land:
            moving_plane.land(current_time);
            break;
        case takeoff:
            moving_plane.fly(current_time);
            break;
        case idle:
            run_idle(current_time);
        }
    }
    small_airport.shut_down(end_time);
}

我已经尝试解决了两天,所以我真的需要帮助。预先感谢!

a546335402 回答:编译问题。错误E0413,E0434,C2664,C2440

您正在尝试将Plane固定在大小为char的孔中。编译器告诉您,它不知道如何将Plane转换为您定义为Queue_entry的{​​{1}}。

如果您希望char能够从Plane继承。您应该熟悉多态,因为这似乎就是您想要的。

但是即使那样,由于似乎您没有充分考虑对象的内存分配,事情还是可能无法解决。如果要将对象放入向量中,则将根据需要由向量分配它们。这意味着您不能具有接口向量,因为实现接口的对象可以具有任何大小。相反,您可以做的是向量Queue_entry

本文链接:https://www.f2er.com/3159393.html

大家都在问