Error C2259 cannot instantiate abstract class

Рейтинг: -2Ответов: 1Опубликовано: 04.03.2023

Please, help me to solve the error My code:

#include <iostream>
#include <string>
#include <vector>


using namespace std;

struct Address {
    int buildingNumber;
    string street;
    string city;
};

class IBuilding {
private:
    //Address adr;
public:
    Address adr;
    IBuilding(const string& streetP, const string& cityP) {
        adr.street = streetP;
        adr.city = cityP;
    };
    virtual void Init()=0;
    virtual void Print()=0;
    virtual void setAddress()=0;
    virtual ~IBuilding();
    
};

class Scool : public IBuilding
{
protected:
public:
    Scool();
    Scool(const string& streetP, const string& cityP, const int& numP)
        :IBuilding(streetP, cityP) {
        adr.buildingNumber = numP;
    };
    virtual void Init() override {};
    virtual void Print() override {
        cout << adr.street << endl;
        cout << adr.city << endl;
    };
    void setAddress() override {};
    ~Scool(){};
};

class Street {
private:
    //IBuilding** buildings;
    vector<IBuilding> buildings;
    string street{ "" };
    string city{ "" };
    int streetSize{ 0 };
public:
    Street(){
        buildings.clear();
        street = "";
        city = "";
        streetSize = 0;
    };
    Street(const int& streetSizeP, string streetP, string cityP) {
        buildings.push_back(Scool(streetP, cityP,10));
        streetSize = streetSizeP;
    };
    void print() {
        buildings[0].Print();
    }
    ~Street() {

    };
};


int main() {
    Street str1(10,"test1","test2");
    str1.print();
    return 0;
}

Ответы

▲ 2Принят

Вот такие исправления, например:

     virtual void Print()=0;
     virtual void setAddress()=0;
-    virtual ~IBuilding();
+    virtual ~IBuilding() = default;
     
 };

 

 class Street {
 private:
     //IBuilding** buildings;
-    vector<IBuilding> buildings;
+    vector<IBuilding*> buildings;
     string street{ "" };
     string city{ "" };
     int streetSize{ 0 };



     };
     Street(const int& streetSizeP, string streetP, string cityP) {
-        buildings.push_back(Scool(streetP, cityP,10));
+        buildings.push_back(new Scool(streetP, cityP,10));
         streetSize = streetSizeP;
     };
     void print() {
-        buildings[0].Print();
+        buildings[0]->Print();
     }
     ~Street() {
-
+        for(auto ib: buildings) delete ib;
     };
 };