【发布时间】:2022-01-04 14:42:19
【问题描述】:
我有一个UserAcount 类,它有一个抽象类ContBancar,还有一个类Banca 从文件中读取一些用户(使用方法void Banca::citire_conturi())。当它读取用户时,我在ContBancarvoid setBal(double bal) { _balanta = bal; } 中收到错误“访问冲突写入位置”。谢谢帮忙!
PS:文件只有一行:1CBS Dragos 0 dragos12! Gzpvia01=。 另外,我想制作一个银行账户系统,它的用户类有一个银行账户类,它继承了 3 种银行账户类型,还有一个银行类,它从文件中读取一些用户或将它们放在上面。
class UserAccount
{
private:
std::string _nume, _user, _pass;
std::string _cod_us;
std::shared_ptr <ContBancar> _cont;
public:
void setUser(std::string user) { _user = user; }
void setPass(std::string pass) { _pass = pass; }
void setNume(std::string nume) { _nume = nume; }
void setCodUs(std::string cod) { _cod_us = cod; }
void setContBal(double balanta) { (*_cont).setBal(balanta); }
std::string getUser() const { return _user; }
std::string getPass() const { return _pass; }
std::string getNume() const { return _nume; }
std::string getCodUs() const { return _cod_us; }
double getContBal() const { return (*_cont).getBal(); }
void setContBancar();
};
void UserAccount::setContBancar()
{
if (_cod_us == "1CBS")
_cont.reset(new ContBancarSilver());
else if (_cod_us == "2CBG")
_cont.reset(new ContBancarGold());
else
_cont.reset(new ContBancarDiamond());
}
class ContBancar
{
protected:
double _balanta;
public:
void setBal(double bal) { _balanta = bal; }
double getBal() { return _balanta; }
virtual bool depozitare(unsigned int) = 0;
virtual bool retragere(unsigned int) = 0;
};
class Banca
{
private:
std::vector<UserAccount> vec;
public:
void citire_conturi();
};
void Banca::citire_conturi()
{
std::ifstream file;
file.open("Baza_Date.txt");
UserAccount temp;
std::string cod, nume, user, pass;
double balanta;
while (file >> cod >> nume >> balanta >> user >> pass)
{
temp.setCodUs(cod);
temp.setNume(nume);
temp.setContBal(balanta);
temp.setUser(user);
temp.setPass(pass);
vec.push_back(temp);
}
file.close();
}
class ContBancarSilver : public ContBancar
{
private:
static constexpr unsigned int max_balanta = 5000;
static constexpr unsigned int max_depozitare = 2500;
static constexpr unsigned int max_retragere = 1000;
static constexpr double tax_retragere = 0.08;
static constexpr double bonus_depunere = 0.03;
static constexpr double bonus_tax_retragere = 0.05;
static constexpr unsigned int max_depozitari = 1;
static constexpr unsigned int max_retrageri = 1;
public:
virtual bool depozitare(unsigned int) override;
virtual bool retragere(unsigned int) override;
};
【问题讨论】:
-
_cont从未初始化,因此它包含nullptr!所以setContBal调用未定义的行为。继承ContBancar并实现抽象的类在哪里? -
顺便说一句:总是用英文编码,这样每个人都可以阅读和理解你的代码。
-
我认为你不需要用英文编码。获得帮助可能更容易,但我认为这并不重要。
-
您可能希望 ro 阅读更多关于如何使用
shared_ptr及其用途的信息。例如,您为什么要分享ContBancar,以及与谁分享? -
@floomby 非常糟糕的建议。他越早开始用英语编写代码就越好。即使是残缺的英语版本也会更好。如果您学会使用您的母语,那么以后将很难切换到英语。如果您更喜欢用您的母语编写代码,您可以将薪水除以 2 或 3。
标签: c++ oop abstract-class