我有一个类EDSobject:
class EDSobject
{
public:
...
int index;
int subindex;
std::string parameter;
std::string dataType;
int value;
};
在我的代码中,我将此类的对象写入stringstream文件:
if (obj.dataType == "0x0002" || obj.dataType == "0x0003" || obj.dataType
== "0x0004") //signed data types
{
file << " 0x" << obj.subindex << " " <<
obj.parameter << " = " << dec << (int16_t)obj.value << endl;
}
else //unsigned data types
{
file << " 0x" << obj.subindex << " " <<
obj.parameter << " = " << dec << obj.value << endl;
}
您可以看到,如果dataType为“ 2”,“ 3”或“ 4”,则将值强制转换为有符号整数(obj.value中的值是无符号整数)。这样可以。例如,我从64150得到-1386。
问题是,当我尝试仅使用铸造时,就像这样:
void EDScastAllValues()
{
for (EDSobject obj : EDScontainer)
{
if (obj.dataType == "0x0002" || obj.dataType == "0x0003" ||
obj.dataType == "0x0004") //signed data types
{
int16_t newVal = static_cast<int16_t>(obj.value);
//or int16_t newVal = (int16_t)obj.value;
obj.value = newVal;
}
}
}
然后以相同的方式编写所有对象,而不使用if语句。
file << " 0x" << obj.subindex << " " << obj.parameter << " = " << dec << obj.value << endl;
在这里,obj.value不变-64150仍然是64150。我没有像以前那样得到负值。
我在这里做错了什么?
编辑:忘记添加EDSContainer的定义。
set<EDSobject, cmp> EDScontainer;
最佳答案
您正在从容器中复制对象并修改副本。
你要:
for(auto& obj: EDSContainer)