Недопустимый абстрактный тип

Итак, у меня проблема с абстрактным классом!

Это продукт.h

#ifndef PRODUCT_H
#define PRODUCT_H
#include <string>

using namespace std;

class Product
{
    private:
        string description;
        int d,m,y;
        float weight;

    public:
        Product();
        Product(string description,int d,int m,int y, float weight);
        void print();
        virtual bool isExpiring()=0;
};

#endif

Это Product.cpp

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

Product::Product()
{
    description="";
    d=0;
    m=0;
    y=0;
    weight=0.0;
}

Product::Product(string description,int d,int m,int y, float weight)
{
    this->description=description;
    this->d=d;
    this->m=m;
    this->y=y;
    this->weight=weight;
}

void Product::print()
{
    cout << "Description: " << description<<endl;
    cout << "Expiration date: " << d <<"/" << m << "/" << y << endl;
    cout << "Weight: " << weight << endl;
}

Это ShortTermProduct.h

#ifndef SHORTTERMPRODUCT_H
#define SHORTTERMPRODUCT_H
#include "Product.h"

class ShortTermProduct : public Product
{
    public:
        ShortTermProduct();
        void Print();
        bool isExpiring();
};

#endif

Это LongTermProduct.h

#ifndef LONGTERMPRODUCT_H
#define LONGTERMPRODUCT_H
#include "ShortTermProduct.h"
#include <string>

using namespace std;

class LongTermProduct 
{
    private:
        int lifetime;
        string open, open_date;

    public:
        LongTermProduct(int lifetime,string open,string open_date);
        void print();
        bool isExpiring();
};

#endif

И, наконец, это Fridge.h

#ifndef FRIDGE_H
#define FRIDGE_H
#include "LongTermProduct.h"
class Fridge : public LongTermProduct
{
    private:
        Product products[10];

    public:
        fridge();
        void addShortTermProduct (ShortTermProduct p);
        void addLongTermProduct (LongTermProduct p);
        void printFridgeProducts();
        bool isExpiring();
};

#endif

Ошибки, которые я получаю, следующие:

  • [Ошибка] недопустимый абстрактный тип «Продукт» для «продуктов»
  • [Ошибка] нельзя объявить поле «Холодильник:: продукты» абстрактным типом «Продукт».

Любая помощь будет благодарна! Заранее спасибо!


person TonyK    schedule 28.05.2017    source источник
comment
Возможный дубликат Почему мы не можем создать экземпляр абстрактный класс?   -  person Kinan Al Sarmini    schedule 28.05.2017
comment
Какая часть не может объявлять поле «Холодильник:: продукты» абстрактным типом «Продукт», которого вы не поняли? Product — это абстрактный класс, и вы пытаетесь объявить член класса, представляющий собой массив абстрактных классов. Это недопустимый С++. Конец.   -  person Sam Varshavchik    schedule 28.05.2017
comment
Также обратите внимание, что, как правило, целесообразно также объявлять деструктор virtual абстрактного базового класса.   -  person bipll    schedule 28.05.2017


Ответы (2)


virtual bool isExpiring()=0; — чисто виртуальная функция (абстрактная), поэтому Product — абстрактный класс.

Product products[10]; 

Здесь вы пытаетесь создать 10 объектов абстрактного типа Product. Но вы не можете создать объект из абстрактного класса. Вам нужны указатели Product, которые могут указывать на указатели производных классов:

Product** products = new Product*[10];
person Shiro    schedule 28.05.2017
comment
@bipll Ну, это был реторический вопрос. - person πάντα ῥεῖ; 28.05.2017

Ошибка произошла из-за того, что класс Product имеет чисто виртуальный метод, поэтому для его объявления следует использовать указатель. если вы хотите использовать фиксированный размер массива С++, я предлагаю вам посмотреть std::array здесь

std::array<Product*, 50> products;
person Erman    schedule 15.01.2018