【发布时间】:2016-10-06 01:58:27
【问题描述】:
我正在尝试使用std::unordered_set 作为哈希表来存储许多CreditCard。 CreditCard 和另一个类CardDatabase 定义如下:
class CreditCard {
private:
string cardHolder;
unsigned long long cardNumber;
int limit;
int balance;
public:
CreditCard(string in_cardHolder, string in_cardNumber, int in_limit) {
cardHolder = in_cardHolder;
cardNumber = stoll(in_cardNumber);
limit = in_limit;
balance = 0;
}
void ChangeBalance(int amount) const {
balance += amount; // SECOND ERROR
}
};
class CardDatabase {
private:
unordered_set<CreditCard> cards;
unordered_set<CreditCard>::iterator iter;
public:
CardDatabase() { }
void AddCard(cardHolder, cardNumber, int limit) {
CreditCard tempCard = CreditCard(cardHolder, cardNumber, limit);
cards.insert(tempCard);
}
void Charge(string cardHolder, int chargeAmount) {
iter = cards.find(cardHolder);
iter->ChangeBalance(chargeAmount); // FIRST ERROR
}
}
最初我在FIRST ERROR 收到以下编译错误:Member function 'ChangeBalance' not viable: 'this' argument has type 'const CreditCard', but function is not marked const。所以,我在ChangeBalance 函数中添加了“const”。但是,在这样做之后,我在SECOND ERROR 收到以下编译错误:Cannot assign to non-static member within const member function 'ChangeBalance'。
有什么方法可以在不将balance 更改为静态变量的情况下修复此错误?显然,每个CreditCard 实例的余额不同是很重要的。
感谢任何帮助。
编辑:
感谢大家的快速回答。我觉得我应该澄清一些事情。我已经在代码的其他地方添加了适当的哈希功能:
namespace std {
template <>
struct hash<CreditCard> {
size_t operator()(const CreditCard& cc) const
{
return hash<string>()(cc.GetCardHolder());
}
}
}
另外,我最初粘贴的代码来自一个更大的代码库,在发布问题之前我没有删除所有必要的命名空间内容。对于造成的混乱,我深表歉意。
【问题讨论】:
-
您希望
CreditCard::CreditCard和CreditCard::ChangeBalance做什么?
标签: c++ c++11 unordered-set