Кастинг работает по-разному в 2 случаях - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть класс 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 являются целым числом без знака). Это работает хорошо. Например, я получаю -1386 из 64150.

Проблема в том, что я пытался сделать это только с помощью литья, например:

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 Ответ

1 голос
/ 04 апреля 2019

Вы копируете объекты из своего контейнера и модифицируете копии.Вы хотите:

for(auto& obj: EDSContainer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...