2017-05-28 1 views
-2

So habe ich ein Problem mit einer abstrakten Klasse!Ungültiger abstrakter Typ

Dies ist der 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 

Dies ist 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; 
} 

Dies ist ShortTermProduct.h

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

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

#endif 

Dies ist 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 

Und schließlich ist dies 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 

Die Fehler Ich erhalte sind diese:

  • [Fehler] ungültig abstrakten Typ 'Produkt' für 'Produkte'
  • [Fehler] kann Feld 'Kühlschrank :: Produkte' nicht vom abstrakten Typ 'Produkt' sein

Jede Hilfe wäre Rost! Vielen Dank im Voraus!

+0

Mögliche Duplikat suchen [Warum können wir nicht eine Instanz einer abstrakten Klasse erstellen?] (https://stackoverflow.com/questions/5131567/why-cant-we-create-eine-instance-of-abstract-class) –

+0

Welcher Teil von "kann das Feld nicht deklarieren" Fridge :: products "ist vom abstrakten Typ" Product "" du hast nicht verstehen? 'Product' ist eine abstrakte Klasse und Sie versuchen, ein Klassenmitglied zu deklarieren, das ein Array von abstrakten Klassen ist. Dies ist nicht gültig C++. Das Ende. –

+0

Beachten Sie auch, dass es generell ratsam ist, auch den Destruktor der abstrakten Basisklasse 'virtual' zu deklarieren. – bipll

Antwort

-2

virtual bool isExpiring()=0; ist eine reine virtuelle Funktion (abstrakt), daher ist Product eine abstrakte Klasse.

Product products[10]; 

Was Sie hier tun, versucht Product 10 Objekte einer abstrakten Art zu schaffen. Sie können jedoch kein Objekt aus einer abstrakten Klasse erstellen. Was Sie wollen, sind Product Zeiger, die auf Zeiger von abgeleiteten Klassen verweisen kann:

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

Danke Kumpel :) – TonyK

+0

Ich frage mich, wie die Zeiger korrekt initialisiert werden würden. –

+0

@ πάνταῥεῖ 'für (auto & i: Produkte) i = new ShortTermProduct;' – bipll

0

Der Fehler trat auf, weil die Product Klasse eine rein virtuelle Methode hat, deshalb sollten Sie Zeiger verwenden, es zu erklären. wenn Sie C++ feste Array-Größe verwenden möchten, empfehle ich Ihnen bei std::arrayhere

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