У меня есть этот код в моем проекте на c ++:
class StackNode{
public:
StackNode(){
this->varName = NULL;
this->down = NULL;
}
char * varName;
StackNode * down;
};
class Stack{
public:
StackNode * head;
Stack(){
this->head == NULL;
}
bool IsEmpty(StackNode * node){
if(node == NULL){
return true;
}
return false;
}
};
..
..
..
void ST::localVariableStack(StNode * node){
Stack * stack = new Stack();
StNode * temp = node;
checkUndeclaredVarible(temp, stack);
while (temp->left){
checkUndeclaredVarible(temp->left, stack);
temp = temp->left;
}
}
void ST::checkUndeclaredVarible(StNode * node, Stack * stack){
if(ifInteger(node)){
if(node->declared){
stack->AddUnite(node->VarName);
}else{
if(!isItExiteInStack(node, stack)){
this->errRecovery->errQ->enqueue(node->lineno, node->colno, "Undeclared Variable : ", node->VarName);
}
}
}
}
bool ST::isItExiteInStack(StNode * node, Stack * stack){
StackNode * temp = new StackNode();
temp = stack->head;
while(!(stack->IsEmpty(temp))){
if(strcmp(temp->varName, node->VarName) == 0){
return true;
}
temp = temp->down;
}
return false;
}
Проблема в том, что когда я вызываю stack->isempty(temp)
, временный объект переходит к функции isempty
, в ситуации, когда temp пуст, хотяесть конструктор по умолчанию.При проверке (node == NULL)
в функции isempty
он принимает false
и возвращает false
, а не true
, поэтому после этого функция сломается, потому что он действует как непустой объект.