我有一个类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)

10-08 15:57