2013-03-31 1 views
0

Я объект в моем коде называется «schemeList», который выглядит следующим образом:C++ рекурсивно проходя по выпускам памяти параметра

class scheme; 
class schemeList 
{ 
    friend class scheme; 
private: 

    scheme * head; 
    schemeList * tail; 

public: 
    schemeList(); 
    Token addScheme(vector <Token> &toAdd); 
    //...other functions 
}; 

Функция У меня проблема с это «addScheme», который, как предполагается, чтобы добавить схему в голову, или, если полная голова, добавьте ее в хвост (в виде связанного списка). Вот эта функция у меня до сих пор:

Token schemeList::addScheme(vector<Token>& toAdd) 
{ 
    if (head->retCloseParen() != ')') 
    { 
     scheme * headCopy = head;  
     Token answer = head->addScheme(toAdd); 
     head = headCopy; 
     return answer; 
    } 
    else 
    { 
     //deal with tail 
     schemeList * arrow = this; 

     while (arrow->tail != NULL) 
     { 
      arrow = arrow->tail; 
     } 

     tail = new schemeList(); 

     tail->head= new scheme(); 
     tail->tail = NULL; 

     Token answer = arrow->tail->addScheme(toAdd); 
     return answer; 
    } 
} 

Это прекрасно работает для добавления первой схемы, но вторая схема выдает ошибку, которая говорит «Неизвестное исключение ...». Раньше у меня была такая проблема, но я исправил ее, передав переменную toAdd по ссылке вместо передачи всего объекта. Почему это бросает ошибку и/или как ее исправить?

В случае это делает вещи более ясно, схема является:

class scheme 
{ 
    friend class identifierList; 

public: 
    Token * id; 
    char openParen; 
    char closeParen; 
    identifierList * idList; 

    scheme(); 
    //other functions 
}; 

class identifierList 
{ 
    friend class scheme; 
public: 
    Token * id; 
    identifierList * next; 

    identifierList(Token * inId, identifierList * inNext); 
}; 

И лексема:

class Token 
{ 
    friend class datalogProgram; 

public: 
    int lineNumber; 
    string type; 
    string value; 

    Token(string inType, string inValue, int inLineNum); 
    //other functions 
}; 
+2

Вы должны использовать 'std :: list' или' std :: vector', а не тратить время на переустановку связанного списка. –

+0

Показать реализацию 'schem :: addScheme'. И стек вызовов, где вы получаете исключение. – Paul

ответ

0
  • Не достаточно подробно дается, особенно код, который вызывает исключение , Лучше исследовать стек вызовов!
  • Вы инициализируете head и другие переменные указателя с NULL. Я не вижу конструктора, который это делает. Также нет никаких проверок (это всего лишь проверка head->retCloseParen() != ')').
  • Как было предложено Томасом в комментарии, вам лучше использовать некоторые из классов контейнеров, которые уже доступны для вас.
Смежные вопросы