Передача объекта по указателю и его изменение не изменяет состояние объекта
Код ниже. У меня есть член данных с именем book_b и внутри функции OB::x() этот unordered_map вставляет объекты. При первой вставке ключ равен 10, а новый объект, вставленный с ключом =10, работает нормально. Однако, когда ключ =10 появляется снова, я ожидаю, что новый объект будет создан и вставлен в ключе =10 (заменяя предыдущий объект в ключе =10). Однако, как только OB::x() вернется, когда мы вернемся в OB::y(), это будет как если бы новый объект никогда не был вставлен.
Я думал, что это должно работать, потому что я передаю объект book_b по указателю на функцию, изменяющую ее состояние? Я беспокоюсь, что что-то не так с моим фундаментальным пониманием.
class OB{
public:
void y(O lo);
void x(std::unordered_map<int, PL>* book, int a, long b);
private:
std::unordered_map<int, PL> book_b;
std::unordered_map<int, PL> book_a;
};
void OB::y(O lo){
//Code which obtains parameters to use in x() from lo
int a = o.getA();
long b = o.getB();
//This is the data member the below function will insert an object in to
std::unordered_map<int,PL>* book = &book_b;
//This is the function which should be changing the state of book.
//It works on the first call (when a new object is inserted) but on repeated calls
//(where the object may be replaced with a new object with the same key) it acts
//as if the new key-value pair wasnt replacing the existing key-value pair.
x(book, a, b);
}
//Works when book is empty and we insert a new PL object, however, when I go to "overwrite"
//an existing PL object with the same key (a) it doesn't hold state once the function returns
void OB::x(std::unordered_map<int,PL>* book, int a, long b){
PL temp;
temp.setQuantity(b);
book->insert(std::make_pair(a, temp));
}
2 ответа
std::unordered_map::insert
не вставляет новый элемент, если элемент с таким же ключом уже существует.
auto p = book->insert(std::make_pair(a, temp));
std::cout << std::boolalpha;
std::cout << "Did insert succeed? " << p.second << std::endl;
Если вы хотите обновить существующий элемент, если он существует, используйте operator[]
:
(*book)[a] = temp;
Примечание: вам не нужно передавать указатели, если вы не хотите, чтобы возможность nullptr
проходить Проще использовать ссылки:
void OB::x(std::unordered_map<int,PL>& book, int a, long b) { ... }
x(book_b, a, b);
std::unordered_map::insert
msgstr "вставляет элемент (ы) в контейнер, если контейнер еще не содержит элемент с эквивалентным ключом."
+ Изменить
book->insert(std::make_pair(a, temp));
в
(*book)[a] = temp;
а также обратите внимание, что передача по ссылке вместо указателя будет более разумной и сделает ваш код намного чище:)