2010-12-11 7 views
4


私はC++の新機能で、テキストファイルからコマンドを読み込んでベクトルに置き、glutを使用して描画します。
私はノードクラス、ノードから派生したコマンドクラス、コマンドから4つの派生クラス(前方、左、右、ジャンプ、反復)とコマンドを格納するために使用されるProgクラスを持っています。そのvalues.for例リピートが続く派生クラスメンバにアクセスするための抽象クラスへのポインタのベクトル

class node 
{ 
    public: 
     node(); 
     virtual ~node(); 
     virtual void Run()=0; 
}; 

class command : public node 
{ 
    private: 
     float v; 
    public: 
     command(); 
     command(float); 
     ~command(); 
     virtual void Run(); 
     friend istream& Prog::operator>> (istream& in, Prog& pro); 
}; 

class Repeat : public command 
{ 
    private: 
     Prog pg; 
    public: 
     Repeat(float value, istream& in); 
     ~Repeat(); 
     void Run(); 
     friend istream& Prog::operator>> (istream& in, Prog& pro); 
}; 

class Prog 
{ 
    private: 
     vector<node*> listing; 
    public: 
     Prog(); 
     ~Prog(); 
     void Run(); 
     friend istream& operator>> (istream& in, Prog& pro); 
}; 

今私たちがファイルから読み込まれ、一時ベクトルのコマンドを書くことができますが、4回以下のコマンドを繰り返す必要があり |リピート| 4 |前方| 4 |左| 40 |前方| 10
4つの派生クラスのRun関数を呼び出すために使用される、基本クラスオブジェクトへのProgクラスポインタ内のリストベクターを追加したい多形の
私の問題は私が使用していることです私の一時的なベクトルを通過し、私が見つける各コマンドのオブジェクトを作成するが、私はダイナミックな名前を使用することはできませんので、私は同じ名前を使用することができます(私は思う)と私は各新しいフォワードコマンドは、

else if (command=="FORWARD") 
    { 
     Forward::Forward fw(value); 
     node* ptr; 
     ptr= &fw; 
     pro.push_back(ptr); 
     text.erase (text.begin(), text.begin()+2);*/ 
    } 

私は以下のようなものを使用しようとしたが、

else if (command=="FORWARD") 
    { 
     Forward::Forward fw(value); 
     new Forward(fw); 
     node* ptr; 
     ptr= &(??); 
     pro.push_back(ptr); 
     text.erase (text.begin(), text.begin()+2);*/ 

}

正しい方法を見つけることができませんでしたが、私が欲しいものを行う方法はあります?私はプログレクラスにfriend istream& operator>> (istream& in, Prog& pro);を定義し :最後に、我々はこのも

void Prog::Run() 
{ 
     vector<node*>::iterator it; 
     for (it=listing.begin();it!=listing.end();it++) 
     listing[it]->Run(); 
} 

私が宣言され、イムそれは正しいですかどうかわから終了していない友人の機能について何かのようになります。そのプログレ::実行 を呼び出したいです他の2つのクラスで宣言したばかりか、クラスごとに定義し、それぞれのクラスで異なる第2引数を持つ必要がありますか?
ありがとうございます。

答えて

2

あなたの説明に基づいて、pro.push_back(new Forward(value));がお探しのものです。

また、非プライベートメンバーにアクセスするすべてのクラスで、関数またはクラスをfriendとして宣言する必要があります。

+0

とpro.push_back(new Forward(value));私は値で作成されたオブジェクトへのポインタ、または実際のオブジェクトがベクトルに挿入されるでしょうか? – pmantz

+0

このコードは、** one **オブジェクト(値で作成されたもの)を作成するだけなので、ベクトルのポインタはその1つのオブジェクトを指します。 –

関連する問題