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

Это прекрасно работает для добавления первой схемы, но вторая схема выдает ошибку «Unhandled Exception …». У меня раньше была такая проблема, но я исправил ее, передав переменную 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
};

0

Решение

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

Другие решения

Других решений пока нет …