我有一个名为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;
}
为什么会发生这种情况?
答案 0 :(得分:8)
为什么会发生这种情况?
有两个原因:
SymbolTable::Symbol::used
未在构造函数SymbolTable::Symbol(string, double)
中初始化,而是初始化局部变量。
bool used = false;//This is my boolean flag
- 行开头的bool使它成为新局部变量的声明,隐藏成员变量used
;删除它将引用成员变量bool
。或者,就像汉斯在评论中提到的那样,用this->used = false;
替换该行也会解决这个问题。
您没有启用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;
在构造函数中,我使用initialization lists, which is better而不是成员分配。在打印代码中,我使用std::boolalpha
将布尔值打印为true
或false
而不是整数。