2

我有一个名为的对象Symbol,它代表一个变量。Symbol 具有布尔属性used,即initialized as false. 如果调用它来求解函数以显示它已被使用,则此条件将更改为 true。由于某种原因,当Symbol未使用且used从未更改为 true 时,它​​返回值 204 而不是 false

这是 SymbolTable.h,我在其中定义了一个符号:

class SymbolTable  {
public:
    SymbolTable() {}
    void insert(string variable, double value);
    double lookUp(string variable) ;
    bool unusedVar() ;
private:
    struct Symbol  {
    Symbol(string variable, double value)
    {
        this->variable = variable;
        this->value = value;
        bool used = false;//This is my boolean flag
    }
    string variable;
    double value;
    bool used;
};
...

每当我从 SymbolTable 中查找一个值以插入我设置used为 true 的方程时:

double SymbolTable::lookUp(string variable)  {
    for (int i = 0; i < elements.size(); i++) {
        if (elements[i].variable == variable) {
        elements[i].used = true;//Right here it changes to true
        return elements[i].value;
    }
...

稍后,当我尝试检测是否仍有错误时,它将无法正常工作。当我打印它的值时,used它会打印204

bool SymbolTable::unusedVar() {// returns error if Var is not used
int count = 0;
for (int i = 0; i < elements.size(); i++) {
    std::cout << "Variable: " << elements[i].variable << " was " << elements[i].used << std::endl;
    if ( !elements[i].used ) {
        std::cout << "Warning: A variable was not used" << std::endl;
        return true;
    }
}
return false;
}

为什么会发生这种情况?

4

1 回答 1

8

为什么会发生这种情况?

两个原因:

  1. SymbolTable::Symbol::used没有在构造函数中初始化SymbolTable::Symbol(string, double),而是在初始化局部变量。

    bool used = false;//This is my boolean flag- 行首的 bool 使它成为一个新局部变量的声明,隐藏了成员变量used;删除它将引用成员变量bool。或者,就像汉斯在评论中提到的那样,用替换该行this->used = false;也可以解决它。

  2. 您没有启用该std::boolalpha标志,因此std::cout只会将布尔值打印为整数;因此底层整数值被打印出来;在这种情况下,它是一个未初始化的随机值 (204)。

这应该解决它:

struct Symbol {
    Symbol(string variable, double value) : variable(variable), value(value), used(false)
    {
    }
...

std::cout << "Variable: " << elements[i].variable << " was " << std::boolalpha << elements[i].used << std::endl;

在构造函数中,我使用了初始化列表,而不是成员分配,这更好。在打印代码中,我使用std::boolalpha将布尔值打印为整数truefalse代替整数。

于 2013-10-12T17:51:44.707 回答