2010-12-11 5 views
4


Je suis nouveau en C++ et essaie d'implémenter un émulateur de tortue qui va lire les commandes d'un fichier texte, les mettre sur un vecteur et les dessiner en utilisant la surabondance
J'ai une classe de nœuds, une classe de commande dérivée du nœud, 4 classes dérivées (forward, left, right, jump, repeat) de la commande et de la classe Prog qui est utilisée pour stocker les commandes.Vecteur de pointeurs vers la classe abstraite, pour accéder aux membres dérivés de la classe

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

et

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

en ce moment nous sommes en mesure de lire à partir d'un fichier et d'écrire des commandes dans un vecteur temp, suivi par leur répétition exemple values.for devrait répéter 4 fois les commandes suivantes | repeat | 4 | forward | 4 | left | 40 | forward | 10
nous voulons ajouter dans le vecteur de liste à l'intérieur des pointeurs de classe Prog aux objets de classe de base, qui serait utilisé pour appeler la fonction Run des 4 classes dérivées et faire usage de polymorphisme
mon problème est que j'utilise un moment pour passer par mon vecteur temp, et créer un objet pour chaque commande que je trouve, mais je ne peux utiliser le même nom, car le nommage dynamique ne peut pas être utilisé (je pense) et je pense que chaque nouvelle commande Forward écrasera l'objet fw

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

J'ai essayé d'utiliser quelque chose comme ci-dessous, mais n'a pas pu trouver une bonne façon

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

}

est-il un moyen de faire ce que je veux ?? à la fin, nous voulons appeler Prog :: Run qui ressemble à quelque chose comme ça

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

aussi quelque chose sur les fonctions des amis que j'ai déclaré et je ne suis pas quitter que si elle est juste: I défini friend istream& operator>> (istream& in, Prog& pro); la classe Prog et vient de le déclarer dans les 2 autres classes ou je dois le définir pour chaque classe et avoir un second argument différent dans chaque classe ??
merci d'avance :)

Répondre

2

D'après ce que vous décrivez, pro.push_back(new Forward(value)); est ce que vous cherchiez.

De plus, une fonction ou une classe doit être déclarée comme ami dans chaque classe qui aura accès à des membres non privés.

+0

avec pro.push_back (nouveau Forward (valeur)); Je vais avoir un pointeur vers l'objet créé avec la valeur, ou l'objet réel inséré dans le vecteur? – pmantz

+0

Ce code crée uniquement ** un ** objet (créé avec la valeur), de sorte que le pointeur dans le vecteur pointe vers cet objet. –

Questions connexes