2017-05-28 53 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;