【问题标题】:cannot declare variable of abstract type for Parking Lot OOP in C++无法在 C++ 中为停车场 OOP 声明抽象类型的变量
【发布时间】:2019-03-05 06:57:40
【问题描述】:

我有以下代码

Vehicle.h:

#pragma once
class Vehicle
{
    public:
        Vehicle();
        ~Vehicle();
    private:
        int wheels;
};

Car.h

#pragma once
#include "Vehicle.h"
class Car: public Vehicle
{
    public:
        Car();
        ~Car();
    private:
        int wheels=4;
};

ParkingLot.h

#pragma once
#include <vector>
#include <string>
#include "ParkingSpace.h"
#include "HandicappedParkingSpace.h"
#include "CompactParkingSpace.h"
#include "RegularParkingSpace.h"
class ParkingLot
{
    public:
        ParkingLot();
        ~ParkingLot();
        void ParkVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps);
        void ReleaseVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps);
        void getOccupiedSpaces();
    private:
        int value;
        std::vector <HandicappedParkingSpace> occupied_handicapparkingspaces;
        std::vector <HandicappedParkingSpace> vacant_handicapparkingspaces;
        std::vector <RegularParkingSpace> occupied_regularparkingspaces;
        std::vector <RegularParkingSpace> vacant_regularparkingspaces;
        std::vector <CompactParkingSpace> occupied_compactparkingspaces;
        std::vector <CompactParkingSpace> vacant_compactparkingspaces;
};

ParkingLot.cpp:

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include "ParkingLot.h"

using namespace std

ParkingLot::ParkingLot() {
    for (int i=0; i<5; i++) {
        HandicappedParkingSpace HPS(1, Null);
        vacant_handicapparkingspaces.push_back(HPS);
    }
    for (int i=0; i<5; i++) {
        CompactParkingSpace CPS(1, Null);
        vacant_compactparkingspaces.push_back(CPS);
    }
    for (int i=0; i<5; i++) {
        RegularParkingSpace RPS(1, Null);
        vacant_regularparkingspaces.push_back(RPS);
    }
    cout<<"finished parking lot"<<endl;
}


void ParkingLot::ParkVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps)
{
    if (ps=="Handicapped") {
        if (vacant_handicapparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_handicapparkingspaces.pop_back();
            occupied_handicapparkingspaces.push_back(_ps);
        }
        else
        {
            cout<<"No handicapped spaces available"<<endl;
        }
    }
    else if  (ps=="Compact") {
        if (vacant_compactparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.pop_back();
            occupied_compactparkingspaces.push_back(_ps);
        }
        else
        {
            cout<<"No compact spaces available"<<endl;
        }
    }
    else {
        if (vacant_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_regularparkingspaces.pop_back();
            occupied_regularparkingspaces.push_back(_ps);
        }
        else {
            cout<<"No regular spaces available"<<endl;
        }
    }

}

void ParkingLot::ReleaseVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps)
{
    _ps.vacant=1;
    _ps.vehicle= Null;
    if (ps=="Handicapped") {
        if (occupied_regularparkingspaces.size()!=0) {
            vacant_handicapparkingspaces.push_back(_ps);
            occupied_handicapparkingspaces.pop_back();
        }
        else {
            cout<<"Unable to release any handicapped spaces"<<endl;
        }
    }
    else if  (ps=="Compact") {
        if (occupied_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.pop_back(_ps);
            occupied_compactparkingspaces.push_back();
        }
        else {
            cout<<"Unable to release any compact spaces"<<endl;
        }
    }
    else {
        if (occupied_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_regularparkingspaces.pop_back(_ps);
            occupied_regularparkingspaces.push_back();
        }
        else {
            cout<<"Unable to release any regular spaces"<<endl;
        }
    }
}

void ParkingLot::getOccupiedSpaces() {
    cout<<"Occupied handicap spaces: "<<occupied_handicapparkingspaces.size()<<endl;
    cout<<"Vacant handicap spaces: "<<vacant_handicapparkingspaces.size()<<endl;
    cout<<"Occupied compact spaces: "<<occupied_compactparkingspaces.size()<<endl;
    cout<<"Vacant compact spaces: "<<vacant_compactparkingspaces.size()<<endl;
    cout<<"Occupied regular spaces: "<<occupied_regularparkingspaces.size()<<endl;
}

ParkingSpace.h:

#pragma once

#include "Vehicle.h"

class ParkingSpace
{
    public:
        ParkingSpace();
        ~ParkingSpace();
        virtual void parkvehicle()=0;


    private:
        Vehicle *vehicle;
        bool vacant; 

};

HandicappedParkingSpace.h:

#pragma once

#include "ParkingSpace.h"

class HandicappedParkingSpace : public ParkingSpace
{
    public:
        HandicappedParkingSpace(int _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }

        ~HandicappedParkingSpace();

        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;
        }

    private:
        int vacant;
        Vehicle *vehicle;

};

RegularParkingSpace.h:

#pragma once

#include "ParkingSpace.h"

class RegularParkingSpace : public ParkingSpace
{
    public:
        RegularParkingSpace(int _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }
        ~RegularParkingSpace();
        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;
        }

    private:
        int vacant;
        Vehicle *vehicle;


};

CompactParkingSpace.h:

#pragma once

#include "ParkingSpace.h"

class CompactParkingSpace : public ParkingSpace
{
    public:
        CompactParkingSpace(int _vacant, Vehicle* _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }
        ~CompactParkingSpace();

        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;

        }

    private:
        int vacant;
        Vehicle *vehicle;


};

main.cpp:

#include "ParkingLot.h"
#include "HandicappedParkingSpace.h"
#include "RegularParkingSpace.h"
#include "CompactParkingSpace.h"
#include "Car.h"
#include <iostream>

using namespace std;

int main()
{
    ParkingLot PL;
    Car c1;
    HandicappedParkingSpace HPS;
    PL.ParkVehicle(c1, HPS, "Handicapped");
    Car c2;
    CompactParkingSpace CPS;
    PL.ParkVehicle(c2, CPS, "Handicapped");

    PL.getOccupiedSpaces();

    cout<<"FINISHED"<<endl;
    //delete d;
        return 0;
}

这是我得到的错误:https://pastebin.com/p0vzb0Mz(错误太长,我无法在此处发布)

有人可以帮忙吗?

编辑

我修改了ParkingLot.cpp,现在看起来像

#pragma once

#include <iostream>
#include <string>
#include <vector>
#include "ParkingLot.h"

using namespace std;


ParkingLot::ParkingLot() {
    for (int i=0; i<5; i++) {
        HandicappedParkingSpace HPS(1, nullptr);
        vacant_handicapparkingspaces.push_back(HPS);
    }
    for (int i=0; i<5; i++) {
        CompactParkingSpace CPS(1, nullptr);
        vacant_compactparkingspaces.push_back(CPS);
    }
    for (int i=0; i<5; i++) {
        RegularParkingSpace RPS(1, nullptr);
        vacant_regularparkingspaces.push_back(RPS);
    }
    cout<<"finished parking lot"<<endl;
}


void ParkingLot::ParkVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps)
{
    if (ps=="Handicapped") {
        if (vacant_handicapparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_handicapparkingspaces.pop_back();
            occupied_handicapparkingspaces.push_back(_ps);
        }
        else
        {
            cout<<"No handicapped spaces available"<<endl;
        }
    }
    else if  (ps=="Compact") {
        if (vacant_compactparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.pop_back();
            occupied_compactparkingspaces.push_back(_ps);
        }
        else
        {
            cout<<"No compact spaces available"<<endl;
        }
    }
    else {
        if (vacant_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_regularparkingspaces.pop_back();
            occupied_regularparkingspaces.push_back(_ps);
        }
        else {
            cout<<"No regular spaces available"<<endl;
        }
    }

}


void ParkingLot::ReleaseVehicle(Vehicle _v, ParkingSpace& _ps, std::string ps)
{
    //_ps.vacant=1;
    //_ps.vehicle= nullptr;
    _ps.setVehicle(1, nullptr);

    if (ps=="Handicapped") {
        if (occupied_regularparkingspaces.size()!=0) {
            vacant_handicapparkingspaces.push_back(_ps);
            occupied_handicapparkingspaces.pop_back();
        }
        else {
            cout<<"Unable to release any handicapped spaces"<<endl;
        }
    }
    else if  (ps=="Compact") {
        if (occupied_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_compactparkingspaces.push_back(_ps);
            occupied_compactparkingspaces.pop_back();
        }
        else {
            cout<<"Unable to release any compact spaces"<<endl;
        }
    }
    else {
        if (occupied_regularparkingspaces.size()!=0) {
            _ps.parkvehicle(_v);
            vacant_regularparkingspaces.push_back(_ps);
            occupied_regularparkingspaces.pop_back();
        }
        else {
            cout<<"Unable to release any regular spaces"<<endl;
        }
    }
}

void ParkingLot::getOccupiedSpaces() {
    cout<<"Occupied handicap spaces: "<<occupied_handicapparkingspaces.size()<<endl;
    cout<<"Vacant handicap spaces: "<<vacant_handicapparkingspaces.size()<<endl;
    cout<<"Occupied compact spaces: "<<occupied_compactparkingspaces.size()<<endl;
    cout<<"Vacant compact spaces: "<<vacant_compactparkingspaces.size()<<endl;
    cout<<"Occupied regular spaces: "<<occupied_regularparkingspaces.size()<<endl;
    cout<<"Vacant regular spaces: "<<vacant_regularparkingspaces.size()<<endl;
}

ParkingSpace.h 现在是

#pragma once

#include "Vehicle.h"

class ParkingSpace
{
    public:
        ParkingSpace();
        ~ParkingSpace();
        virtual void parkvehicle(Vehicle _v)=0;
        virtual void setVehicle(bool vacant, Vehicle _v);


    private:
        Vehicle vehicle;
        bool vacant; 

};

HandicappedParkingSpace.h 现在是

#pragma once

#include "ParkingSpace.h"

class HandicappedParkingSpace : public ParkingSpace
{
    public:
        HandicappedParkingSpace(int _vacant, Vehicle& _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }

        ~HandicappedParkingSpace();

        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;
        }

        void setVehicle(bool _vacant, Vehicle _v) {
            this->vacant=_vacant;
            this->vehicle= _v;
        }


    private:
        int vacant;
        Vehicle vehicle;

};

RegularParkingSpace.h 现在是

#pragma once

#include "ParkingSpace.h"

class RegularParkingSpace : public ParkingSpace
{
    public:
        RegularParkingSpace(int _vacant, Vehicle& _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }
        ~RegularParkingSpace();
        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;
        }

        void setVehicle(bool _vacant, Vehicle _v) {
            this->vacant=_vacant;
            this->vehicle= _v;
        }

    private:
        int vacant;
        Vehicle vehicle;


};

CompactParkingSpace.h 现在是

#pragma once

#include "ParkingSpace.h"

class CompactParkingSpace : public ParkingSpace
{
    public:
        CompactParkingSpace(int _vacant, Vehicle& _v) {
            this->vacant=_vacant;
            this->vehicle=_v;
        }
        ~CompactParkingSpace();

        void parkvehicle(Vehicle _v) {
            this->vacant=0;
            this->vehicle=_v;

        }

        void setVehicle(bool _vacant, Vehicle _v) {
            this->vacant=_vacant;
            this->vehicle= _v;
        }

    private:
        int vacant;
        Vehicle vehicle;


};

main.cpp 现在是

#include "ParkingLot.h"
#include "HandicappedParkingSpace.h"
#include "RegularParkingSpace.h"
#include "CompactParkingSpace.h"
#include "Car.h"
#include <iostream>

using namespace std;

int main()
{
    ParkingLot PL;
    Car c1;
    HandicappedParkingSpace HPS(1, nullptr);
    PL.ParkVehicle(c1, HPS, "Handicapped");
    Car c2;
    CompactParkingSpace CPS(1, nullptr);
    PL.ParkVehicle(c2, CPS, "Handicapped");

    PL.getOccupiedSpaces();

    cout<<"FINISHED"<<endl;
    //delete d;
        return 0;
}

但现在我收到这些错误,似乎它们主要与nullptrhttps://pastebin.com/hVdcSc63

我认为push_back 错误是因为我需要将std:vectors 如occupied_handicapparkingspaces&lt;HandicappedParkingSpace&gt; 更改为&lt;HandicappedParkingSpace&amp;&gt;,然后我收到此错误:https://pastebin.com/QkWC6SRk

【问题讨论】:

  • 你试过一一阅读错误吗? 20% 是写Null(不存在)而不是nullptrNULL。另外 30% 是关于 parkVehicle,它不会在您的基类中使用参数,但在子类中会使用。正如编译器所说,由于此方法未被覆盖,因此您的子类也被认为是抽象的。为了帮助自己识别此类错误,请将 override 关键字放在子类中的覆盖方法上(即 CompactParkingSpace 中的 void parkVehicle(Vehicle _v) override
  • class Vehicle { int wheels; }; class Car : public Vehicle { int wheels=4; }; - 但您知道知道VehiclewheelsCar的不一样,是吗?跨度>
  • Offtopic:设计问题:对空置和占用的停车场有不同的向量对我来说似乎是有问题的。自发地,我宁愿将两者放在同一个向量中,而是在基类中添加一个标志isOccupied。这避免了在向量中移动批次的必要性(并保留它们的顺序,如果感兴趣的话)。当然,这取决于用例;如果您的主要目标只是尽快找到免费停车场,那么您的方法可能会更好......
  • 我用nullptrs 替换了Null 并得到了EDIT 中提到的新错误

标签: c++ oop abstract-class


【解决方案1】:

不能在 C++ 中为停车场 OOP 声明抽象类型的变量

ParkingSpace 是一个抽象类,因为virtual void parkvehicle()=0;HandicappedParkingSpace 继承了 ParkingSpace 而没有定义 parkvehicle 所以它也是一个抽象类,那么你不能实例化 HandicappedParkingSpace 这就是为什么你有关于HandicappedParkingSpace HPS(1, Null); 和等效情况的错误

注意 Null 必须替换为 NULL 或更好的nullptr,你还有很多其他错误,我只是回答你的标题。 ..


修改后

我鼓励你不要混用 using namespace std;std::xxx,如果你使用 std 前缀,删除你所有的 using

ParkingLot.cpp:13:41: 错误:没有匹配函数调用‘HandicappedParkingSpace::HandicappedParkingSpace(int, std::nullptr_t)’ HandicappedParkingSpace HPS(1, nullptr);

HandicappedParkingSpace的构造函数第二个参数的类型是Vehicle&amp;nulltr不兼容,你把Vehicle&amp;Vehicle*混淆了,只有指针可以为 nulltr

赋值

我认为 push_back 错误是因为我需要将 std:vectors 例如占用的_handicapparkingspaces 从 &lt;HandicappedParkingSpace&gt; 更改为 &lt;HandicappedParkingSpace&amp;&gt;

不,问题是您使用 occupied_handicapparkingspaces.push_back(_ps);ps_std::stringstd::string 不是 HandicappedParkingSpace 并且没有从 std::string 转换为残疾人停车位

【讨论】:

  • 更好:nullptr - C++ keywords 应该优先于旧的(过时的?)C macros
  • 我用nullptrs 替换了Null 并得到了EDIT 中提到的新错误
  • @user5739619 确定你还有其他错误,正如我所说,我只回答你的标题
  • @user5739619 我编辑了我的答案来谈谈你的一些其他问题,但我们不能这样继续下去,这不是最初的问题,请接受我的回答以解决问题,看看我的添加并尝试自己解决您的问题。如果您不理解某些错误,请打开一个新问题。
  • “HandicappedParkingSpace 继承了 ParkingSpace 而没有定义 parkvehicle ”。我不明白这一点。不是在原HandicappedParkingSpacevoid parkvehicle(Vehicle _v) { this-&gt;vacant=0; this-&gt;vehicle=_v; } 下定义的吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-23
  • 2012-07-23
  • 1970-01-01
  • 2016-07-04
  • 2016-08-22
  • 2013-03-09
  • 2021-12-07
  • 2016-05-10
相关资源
最近更新 更多