2016-11-12 1 views
0

以下のC++コードをコンパイルし、私は次のようなエラーメッセージが出てい:C++動的バインディングとpure仮想クラスを使用するときの正しい構文は何ですか?

「抽象クラスタイプ 『TrainerClass』が無効new式は関数 『仮想のボイドTrainerClass :: AddItemsは()』内に純粋であるため、 'TrainerClass' "

このコードの目的は、トレーナーの数(int nbrtrainer = 2;)に相当する数の「stuff」オブジェクトを初期化することです。この例では、stuff [0]とstuff [1]( 'TrainerClass'クラスへのポインタ)という2つのstuffオブジェクトを作成する必要があります。次に、各「stuff」オブジェクトの内部は、「BagClass」クラスを「stuff」オブジェクトに指定することで定義する必要があります。

難しいのは、 'TrainerClass'クラスには、クラスオブジェクトをいつものように初期化することを防ぐ純粋な仮想関数が含まれていることです。

動的バインディングの概念を使用して仮想クラスから派生したオブジェクトを初期化する正しい構文は何ですか? (すべてのオブジェクトは、インデックスを使用して '[x]のようなもの' と呼ばれるべきである)

#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

を使用することです++メモリを扱い、おそらく[良い本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を開くべきです - ここにはいくつかのさまざまなエラーがあります、そしてそれについての良い本を読むことによって解決される可能性のある平凡な悪い習慣の数例があります。 – jaggedSpire

答えて

0

あなたTrainerClassは純粋仮想(= 0)機能AddItems()を持っています。これにより、このクラスのオブジェクトをインスタンス化できなくなります。残念ながら、forループでこれを実行しようとすると、エラーが発生します。

ポインタstuff(stuff要素のみを割り当てたことがある)を初期化したことがないので、動作すれば未定義の動作になります。ここで

動作し、より利便性のため#include <vector>を使用バリアント:

... 
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); 
// 
... 

ここonline demo

そして、ここでも、よりダイナミックなバージョン:

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(); 

次の改善は、あなたがどのようにCについて、いくつかの誤解を持っているように思えスマートポインタの代わりに、生のポインタ;-)

関連する問題