抽象类型无效

时间:2017-05-28 00:28:28

标签: c++ abstract-class pure-virtual

所以我的抽象类有问题!

这是Product.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

我得到的错误是:

  • [错误]“产品”无效的抽象类型“产品”
  • [错误]无法将字段'Fridge :: products'声明为抽象类型'Product'

任何帮助都会得到帮助!提前致谢!

2 个答案:

答案 0 :(得分:1)

发生错误是因为Product类具有纯虚方法,因此您应该使用指针来声明它。如果你想使用c ++固定数组大小,我建议你看看std::array here

std::array<Product*, 50> products;

答案 1 :(得分:-2)

virtual bool isExpiring()=0;是一个纯虚函数(抽象),因此Product是一个抽象类。

Product products[10]; 

你在这里做的是尝试创建一个抽象类型Product的10个对象。但是您无法从抽象类创建对象。你想要的是Product指针,它们可以指向派生类的指针:

Product** products = new Product*[10];