2010-06-12 5 views
0

J'ai une classe symbol_table qui a un vecteur d'objets d'une autre classe row_st.also j'ai aussi une méthode enter où insère des objets de row_st avec un nom passé dans le vecteur de la table de symboles désirée .mais quand j'appelle l'entrée pour entrer des objets avec le nom: a; b; c; j'obtiendrai le résultat suivant: a, b, c; b, c; c.le premier élément du vecteur obtient le nom de tous les entrés objets. et le deuxième élément reçoit également le nom des entrées ultérieures.C++ push_back ne fonctionne pas comme il est supposé

class row_st 
    { 
    public: 
     char* name; 
     type_u type;//int:0,flaot:1;char:2,bool:3,array: 
     int offset; 
     symbol_table *next; 
     symbol_table *current; 
    }; 
    class symbol_table 
    { 
    public: 
    vector <row_st *> row; 
    int type; 
    int header; 
    int starting_stmt; 
    int index; 
    int i; 
    symbol_table *previous; 
    symbol_table(){ header=0; 
     previous=0; index=0;i=0;starting_stmt=0;} 
    }; 

et voilà la méthode entrez:

int enter(symbol_table *table,char* name,type_u type){ 
    row_st *t=new row_st; 
t->name=name; 
t->type=type; 
t->offset=table->index; 
t->current=table; 
table->index++; 
t->next=0; 
table->row.push_back(t); 
table->header +=1; 
return table->row.size()-1; 
    } 

les éléments push_backed tous points à la même adresse.Système nouvel appel fait la même row_st chaque fois qu'il est called.what dois-je faire?

+1

Veuillez enlever toutes les lignes blanches inutiles de votre code - elles le rendent très difficile à lire. –

+0

Pourriez-vous nous montrer exactement comment vous appelez le code ci-dessus? Je suppose que vous devez copier les chaînes que vous passez, soit du côté appelant, soit à l'intérieur de enter. –

Répondre

1

Comme la réponse de Neil Butterworth suggère, le problème n'est probablement pas avec ce code, mais l'endroit où vous l'appelez. L'utilisation de pointeurs de caractères ne rend pas impossible le bon fonctionnement des choses.

Le problème dans ce cas est certainement pas avec push_back. Si vous avez posté la méthode où vous appelez ce code, il peut être possible de voir exactement ce qui ne va pas.

+0

le problème est que je ne peux pas enlever char * .since entrer est appelé dans un programme basé sur c. Je ne devine pas que le problème est avec char *, le pushback a un destructeur qui supprime après l'ajout. n'est pas là le problème? – angela

+0

@angela: Faites juste 'row_st :: name' un' std :: string'. – sbi

+0

@angel: Vous n'êtes pas en train d'ajouter les chaînes au vecteur. Vous ajoutez des pointeurs aux chaînes du vecteur. Le vecteur ne touche pas les cordes elles-mêmes. Si vous utilisez la même mémoire pour toutes les chaînes, les pointeurs pointeront tous vers le même endroit. –

4

Vous ne pouvez pas utiliser de pointeurs de caractères comme cela - vous devez leur allouer du stockage. Mais comme vous utilisez C++, vous devez les supprimer et les remplacer par des instances de la classe std :: string, qui gérera le stockage pour vous.

+0

Les chaînes C * peuvent * être utilisées correctement, même si elles ne le sont pas souvent. Le code qu'elle a posté n'est pas intrinsèquement mauvais. Il laisse simplement la responsabilité de copier les chaînes à l'appelant, ce qui peut être utile dans certains cas. –

Questions connexes