【发布时间】:2021-07-04 17:31:41
【问题描述】:
我正在尝试做一个使用银行卡的OOP模拟,只是为了练习,没什么太复杂的;我收到一个奇怪的错误。这个调用有点傻,但我只是想看看“读取”功能是否正常,而不是测试它的真正目的。我不明白为什么会出现以下错误,我知道我可以直接使用对象访问虚拟方法,而不必使用指针。另外,很抱歉大多数成员不是用英语写的。这是我的代码:
#include <iostream>
#include <string>
using namespace std;
class Card
{
protected:
string nrCard;
string NumeDetinator;
string data_expirare;
int CVV;
double credit;
static unsigned nr_ord;
public:
Card();
Card(string nC, string ND, string d_ex, int cvv, double CRD);
virtual getCredit(); //= 0;
virtual void print(ostream&) const;//= 0;
virtual void read(istream&) ;//= 0;
virtual void print(ostream &) ;//= 0;
};
unsigned Card :: nr_ord = 0;
Card :: Card() : nrCard("XXXX - XXXX - XXXX - XXXX"), NumeDetinator("???? ????"), data_expirare("DD - MM - YY"), CVV(999), credit(0.0) {}
Card :: Card(string nC, string ND, string d_ex, int cvv, double CRD) : nrCard(nC), NumeDetinator(ND), data_expirare(d_ex), CVV(cvv), credit(CRD) {}
void Card::print(ostream& out) const {
out << "numar card: " << this->nrCard << "\n";
out << "Nume detinator: " << this->NumeDetinator << "\n";
out << "data expirare: " << this->data_expirare << "\n";
out << "CVV " << this->CVV << "\n";
out << "Credit disponibil: " << this->credit << "\n";
}
void Card::read(istream& in) {
cout << "Dati datele cardului:\n numar card: ";
in >> this->nrCard;
cout << "\nNumele detinatorului: ";
in >> this->NumeDetinator;
cout << "\nData expirarii: ";
in >> this->data_expirare;
cout << "\nCVV: ";
in >> this->CVV;
cout<< "\ncredit: ";
in >> this->credit;
}
class Card_Standard : Card
{
int limitaExtragere;
double comisionDepasireLimita;
};
class Card_Premium : Card_Standard
{
int m;
};
int main() {
Card C;
C.print(cout); /// error: undefined reference to vtable for Card , id returned 1 exit status;
return 0;
}
【问题讨论】:
-
FWIW,不要将钱存为
double。浮点数学不精确,会导致舍入错误。相反,请使用 64 位宽的整数类型,并将其中的值存储为美分或美分的 10 次方。这为您提供了精确的整数数学运算,并且在需要显示时很容易转换为美元和美分。 -
是的。当谈到现实世界中的金钱时,人们会变得非常奇怪。尽管这是同一个错误,但他们似乎只有在他们的钱四舍五入时才会生气。围捕他们没有问题。愚蠢、矛盾的人类。
-
您缺少
print的非常量版本。
标签: c++ inheritance virtual