2017-05-28 150 views
-2

所以我有一个抽象类的问题!抽象类型无效

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

我得到的错误是这些:

  • [错误]为 '产品'
  • [错误]无效抽象型 '产品'不能申报领域'冰箱::产品'是抽象类型的'产品'

任何帮助将格雷!在此先感谢!

+0

的可能的复制[为什么我们不能创建一个抽象类的实例?](https://stackoverflow.com/questions/5131567/why-can-we-create-an-abstract-class-instance) –

+0

“不能声明字段'Fridge :: products'的部分是抽象类型'Product'不明白? 'Product'是一个抽象类,你试图声明一个抽象类数组的类成员。这是无效的C++。结束。 –

+0

另请注意,声明抽象基类的析构函数'virtual'通常也是明智的。 – bipll

回答

-2

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

Product products[10]; 

你在做什么这里正试图创建一个抽象类Product的10个对象。但是你不能从抽象类创建一个对象。你想要什么是Product指针可以指向派生类的指针:发生

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

谢谢队友:) – TonyK

+0

我不知道如何正确初始化指针。 –

+0

@πάνταῥεῖ'for(auto&i:products)i = new ShortTermProduct;' – bipll

0

错误的原因是Product类有一个纯虚方法,因此,你应该使用指针声明。如果你想用C++固定数组的大小,我建议你看看std::arrayhere

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