2种情况下的投放方式不同

时间:2019-04-04 12:04:37

标签: c++ casting

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

1 个答案:

答案 0 :(得分:1)

您正在从容器中复制对象并修改副本。 您想要:

for(auto& obj: EDSContainer)