С ++ push_back не работает, как положено - PullRequest
0 голосов
/ 12 июня 2010

У меня есть класс symbol_table, в котором есть вектор объектов другого класса row_st. Также у меня есть метод enter, где вставляются объекты row_st с переданным именем в вектор требуемого symbol_table.but, когда я вызываю enter для ввода объектов с именем: a; b; c; я получу следующий результат: a, b, c; b, c; c. первый элемент вектора получает имя всех введенных объектов. и второй элемент также получает имя более поздних записей.

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

и вот метод ввода:

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

все элементы push_backed указывают на один и тот же адрес. Новый вызов делает один и тот же row_st каждый раз, когда он вызывается. Что мне делать?

Ответы [ 2 ]

4 голосов
/ 12 июня 2010

Вы не можете использовать такие указатели символов - вам нужно выделить для них память.Но поскольку вы используете C ++, вы должны удалить их и заменить их экземплярами класса std :: string, который будет управлять хранилищем для вас.

1 голос
/ 12 июня 2010

Как показывает ответ Нила Баттерворта, проблема, вероятно, не в этом коде, а в том месте, где вы его называете.Использование указателей на символы не делает невозможным заставить все работать, только сложнее.

Проблема в этом случае определенно , а не с push_backЕсли вы разместили метод, где вы вызываете этот код, возможно, вы сможете точно увидеть, что идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...