вставка в unordered_map потерялась - PullRequest
0 голосов
/ 27 марта 2020

У меня следующий код, но после запуска кода результат пуст, есть идеи, почему результат пуст? ссылка на результат в функции main была передана в myclass, я думал, что функция addToResult действительно добавит данные в результат, и я ожидаю, что ключ карты = "test", value = "1": "1". Я немного новичок в C ++. Спасибо!

#include <iostream>
#include <string>
#include <unordered_map>

using LookUpTable = std::unordered_map<std::string, std::string>;
using DLTable = std::unordered_map<std::string, LookUpTable>;

class MyClass
{
public:
    MyClass(DLTable& dltable) {
        m_dltable = dltable;
    };

    void addToResult() {
        LookUpTable ee;
        ee.emplace("1", "1");
        m_dltable.emplace("test", ee);
    };

 private:
    DLTable m_dltable;   
};


int main ()
{

  DLTable result;
  MyClass myclass(result);
  myclass.addToResult();

  std::cout << "myrecipe contains:" << std::endl;
  for (auto& x: result) {
        std::cout << x.first << ": "<< std::endl;
        for (auto& xx : x.second) {
            std::cout << xx.first << ": " << xx.second << std::endl;    
        }

  }
  std::cout << std::endl;
  return 0;
}

1 Ответ

1 голос
/ 27 марта 2020

Давайте посмотрим на упрощенный пример:

int a = 0;
int &b = a;
int c = b;

c = 123;

Изменится ли последнее назначение a? Конечно, нет. Не имеет значения, как вы передаете значение в c по ссылке или нет c является полностью независимой переменной, которая только что инициализирована ссылкой.

Ваш случай такой же - m_dltable - это отдельная переменная, а факт, что вы инициализируете его с помощью ссылки, ничего не меняет. (Ваш случай еще хуже, вы не инициализировали его по ссылке, вы присвоили его)

В целом ваш подход неверен. Если вы хотите напрямую получить доступ к этой переменной, просто сделайте ее доступной c, не пытайтесь создавать изощренные обходные пути для доступа к ней. Если вы хотите инкапсуляцию, просто создайте элементы, которые позволяют перебирать этот контейнер. Например, вернуть константную ссылку на него или иметь begin() и end() методы, которые возвращают (const) итераторы соответственно.

...