#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[]
должны быть выполнены, включая требование к значению карты для наличия конструктора по умолчанию.
У вас есть два варианта устранения ошибки компиляции:
- Добавьте конструктор по умолчанию в свой
Account
класс или - Вы не можете использовать
[]
, вместо этого используйтеat()
; или используйтеfind()
(и сравните его результат сend
()).
Комментарии:
1. Я думаю, что в дополнение к этому вам также нужно создать хэш-функцию для
std::string
, я прав?2. Это правда, что ключ неупорядоченной карты должен иметь хэш-функцию. Хорошей новостью является то, что один из них уже существует в библиотеке C , и с этим больше ничего не нужно делать.