Как получить доступ к методам классов, хранящихся в неупорядоченной карте в C

#c #class #unordered-map

Вопрос:

Итак, у меня есть класс с именем Учетная запись, и я храню его в неупорядоченной карте, но когда я пытаюсь получить доступ к функциям этого класса в карте, он не компилируется. Класс хранится в заголовочном файле «Bank.h».

 class Account {
    double balance;
    std::string username;

    public:
    Account(double balance, std::string username);

    double getBal() {
        return this->balance;
    }

    std::string getName() {
        return this->username;
    }

    void updateBal(double amount) {
        this->balance  = amount;
    }
};
 

Эти функции хранятся в отдельном файле cpp с #include «Bank.h».

 std::unordered_map<std::string, Account> accountList;
Account test(100, "Tester");
std::cout << test.getBal();
accountList.insert(std::make_pair("Test", test));
accountList["Test"].getName();
 

Комментарии:

1. Если вы попытаетесь использовать ‘accountList.at(«Тест»).getName();’?

Ответ №1:

 accountList["Test"].getName();
 

[] Оператор на неупорядоченной карте (и std::map тоже) имеет обязательное требование, которое должно быть выполнено: если ключ карты не существует, он создается, а соответствующее значение создается по умолчанию.

К сожалению, в вашем Account классе нет конструктора по умолчанию, отсюда и сбой компиляции.

Это правда, что непосредственно перед этой строкой кода вы вставляете значение для "Test" в карту, поэтому оно будет существовать. Это, к сожалению, не имеет значения. Все требования operator[] должны быть выполнены, включая требование к значению карты для наличия конструктора по умолчанию.

У вас есть два варианта устранения ошибки компиляции:

  1. Добавьте конструктор по умолчанию в свой Account класс или
  2. Вы не можете использовать [] , вместо этого используйте at() ; или используйте find() (и сравните его результат с end ()).

Комментарии:

1. Я думаю, что в дополнение к этому вам также нужно создать хэш-функцию для std::string , я прав?

2. Это правда, что ключ неупорядоченной карты должен иметь хэш-функцию. Хорошей новостью является то, что один из них уже существует в библиотеке C , и с этим больше ничего не нужно делать.