2016-11-12 1 views
0

Wenn der C++ kompiliert Code unten, erhalte ich folgende Fehlermeldung:C++ Was ist die korrekte Syntax bei Verwendung von dynamischer Bindung und reiner virtueller Klasse?

„Invalid new-Ausdruck der abstrakten Klasse Typ‚TrainerClass‘, weil die‚virtual void TrainerClass :: AddItems()‘Funktion ist rein innerhalb 'TrainerClass' ".

Der Zweck dieses Codes besteht darin, eine Anzahl von "stuff" -Objekten zu initialisieren, die der Anzahl der Trainer entsprechen (int nbrtrainer = 2;). In diesem Beispiel sollten 2 "stuff" -Objekte erstellt werden: stuff [0] und stuff [1] (Zeiger auf die Klasse 'TrainerClass'). Dann sollte das, was in jedem "stuff" -Objekt ist, definiert werden, indem die "BagClass" -Klasse auf die "stuff" -Objekte gerichtet wird.

Die Schwierigkeit hierbei ist, dass die 'TrainerClass'-Klasse eine reine virtuelle Funktion enthält, die verhindert, dass die Klassenobjekte wie üblich initialisiert werden.

Wie lautet die richtige Syntax zum Initialisieren von Objekten, die aus einer virtuellen Klasse mit dem Konzept der dynamischen Bindung abgeleitet wurden?

#include <iostream> 
using namespace std; 

#define Training // to declare the global variable 

///Definition of class Pocket 
class pocket 
{ 
    public: 
     double volume; 
}; 

///Definition of virtual class TrainerClass 
class TrainerClass 
{ 
    public: 
    pocket *Space; 
    virtual void AddItems()=0; 
}; 

///Definition of derived class 
class BagClass: public TrainerClass 
{ 
    public: 
     double mass; 

     BagClass(double m2) 
     { 
     mass=m2; 
     } 

     void AddItems() 
     { 
     cout << "out virtual " << endl; 
     } 
}; 

#ifdef Training 
#define Training 
TrainerClass **stuff=0; 
#else 
extern TrainerClass **stuff; 
#endif 

int main() 
{ 
    int nbrtrainer = 2; 

    TrainerClass **stuff; 
    for(int itrainer=0;itrainer<nbrtrainer;itrainer++) stuff[itrainer] = new TrainerClass; 

    stuff[0] = new BagClass(0.2); 
    stuff[1] = new BagClass(0.5); 

    stuff[0]->AddItems(); 

    return 0; 
} 
+2

Es scheint, wie Sie einige Missverständnisse darüber, wie C++ haben befasst sich mit Speicher und sollte vielleicht ein [gutes Buch] öffnen (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) - es gibt eine Reihe von verschiedenen Fehlern hier und ein paar mehr Fälle von üblen schlechten Praktiken, die wahrscheinlich gelöst werden würden, indem man ein gutes Buch auf dem Thema liest. – jaggedSpire

Antwort

0

Ihre TrainerClass hat eine rein virtuelle (= 0) Funktion AddItems() (Alle Objekte sollten 'stuff [x]' mit einem Index bezeichnet werden). Dies verhindert, dass Sie ein Objekt dieser Klasse instanziieren. Leider versuchen Sie dies in Ihrer for-Schleife, und das verursacht den Fehler.

Beachten Sie übrigens, wenn es funktionieren würde, wäre es undefiniertes Verhalten, weil Sie nie den Zeiger stuff initialisiert haben (Sie ordnen nur stuff Elemente zu).

Hier ist eine Variante, die funktioniert und die Verwendung #include <vector> für mehr Komfort:

... 
vector<TrainerClass*> stuff(nbrtrainer); // vector of the given dynamic size 
//for(int itrainer=0;itrainer<nbrtrainer;itrainer++) 
// stuff[itrainer] = new TrainerClass; // you can't instantiate an abstract class 
stuff[0] = new BagClass(0.2); // this is a valid instantiation 
stuff[1] = new BagClass(0.5); 
// 
... 

Hier die online demo.

Und hier eine noch dynamischere Version:

vector<TrainerClass*> stuff; // empty vector 
stuff.push_back(new BagClass(0.2)); // just add a new eleemnt at the end of the vector 
stuff.push_back(new BagClass(0.5)); 

for (int i=0; i<stuff.size(); i++) 
    stuff[i]->AddItems(); 

Die nächste Verbesserung wäre es, einen intelligenten Zeiger zu verwenden, anstatt ein Rohzeiger ;-)

Verwandte Themen