मेरे पास एक UserAcount वर्ग है जिसमें एक अमूर्त वर्ग ContBancar है, और अन्य वर्ग Banca है जो कुछ उपयोगकर्ताओं को फ़ाइल से पढ़ता है (विधि void Banca::citire_conturi() के साथ)। जब यह उपयोगकर्ताओं को पढ़ता है, तो मुझे ContBancar में void setBal(double bal) { _balanta = bal; } पर "पहुंच उल्लंघन लेखन स्थान" त्रुटि मिलती है। मदद के लिए Thx!

पुनश्च: फ़ाइल में केवल एक पंक्ति है: 1CBS Dragos 0 Dragos12! गज़पविया01=. साथ ही, मैं एक बैंक खाता प्रणाली बनाना चाहता हूं, जिसमें एक उपयोगकर्ता वर्ग है जिसमें बैंक खाता वर्ग है जिसमें 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;
};
0
Dragoș-George Gherasim 26 नवम्बर 2021, 17:36
1
_cont को कभी भी इनिशियलाइज़ नहीं किया जाता है, इसलिए इसमें nullptr! तो setContBal अपरिभाषित व्यवहार का आह्वान करता है। कक्षाओं को विरासत में ContBancar कहां मिल रहा है और अमूर्तन लागू कर रहे हैं?
 – 
Marek R
26 नवम्बर 2021, 17:41
बीटीडब्ल्यू: हमेशा अंग्रेजी में कोड, ताकि हर कोई आपका कोड पढ़ और समझ सके।
 – 
Marek R
26 नवम्बर 2021, 17:46
मुझे नहीं लगता कि आपको अंग्रेजी में कोड करने की जरूरत है। सहायता प्राप्त करना आसान हो सकता है, लेकिन मुझे नहीं लगता कि यह वास्तव में मायने रखता है।
 – 
floomby
26 नवम्बर 2021, 17:49
बहुत बुरी सलाह। वह जितनी जल्दी अंग्रेजी में कोड शुरू करेगा, उतना अच्छा होगा। अंग्रेजी का अपंग संस्करण भी बेहतर होगा। यदि आप अपनी मूल भाषा का उपयोग करना सीखते हैं तो बाद में अंग्रेजी में स्विच करना कठिन होगा। यदि आप अपनी मूल भाषा में कोड करना पसंद करते हैं तो आप अपने वेतन को 2 या 3 से विभाजित कर सकते हैं।
 – 
Marek R
26 नवम्बर 2021, 17:54

1 उत्तर

सबसे बढ़िया उत्तर

उपलब्ध जानकारी के आधार पर आपको अपना कोड इस तरह ठीक करना चाहिए:

class UserAccount
{
    .....
    void setCodUs(std::string cod) {
        _cod_us = cod;
        setContBancar();
    }
    void setContBal(double balanta) {
        if (!_cont) setContBancar(); // lazy initialization
        _cont->setBal(balanta);
    }
    ...
};

void UserAccount::setContBancar()
{
    if (_cod_us == "1CBS")
        _cont = std::make_shared<ContBancarSilver>();
    else if (_cod_us == "2CBG")
        _cont = std::make_shared<ContBancarGold>();
    else
        _cont = std::make_shared<ContBancarDiamond>();
}

नोट मुझे समझ नहीं आ रहा है कि आप किस तरह के तर्क को लागू कर रहे हैं। इन परिवर्तनों ने केवल यह सुनिश्चित किया है कि _cont को इनिशियलाइज़ किया गया है और _cod_us के साथ अप टू डेट है।

कृपया स्पष्ट रूप से new और delete का उपयोग बंद करें। सब कुछ std::make_shared और std::make_unique और std::vector जैसे कंटेनरों द्वारा बनाया जा सकता है।

1
Marek R 26 नवम्बर 2021, 19:08
void UserAccount::setContBancar() इस फ़ंक्शन के साथ मैं चाहता हूं कि मेरे उपयोगकर्ता अपने बैंक खाते के प्रकार से विधियों का उपयोग करें (यदि एना के पास ContBancarSilver है, तो उसके पास अलग-अलग सदस्य मान हैं जैसे कर, आदि, और इसका परिणाम ओवरराइडिंग विधियों में होता है)। समझ में आता है या?
 – 
Dragoș-George Gherasim
26 नवम्बर 2021, 19:14
मुझे समझ में नहीं आता कि आप उस "आलसी आरंभीकरण" का उपयोग क्यों करते हैं
 – 
Dragoș-George Gherasim
26 नवम्बर 2021, 19:24
1
यह डिज़ाइन पैटर्न है: इसका उपयोग होने तक प्रारंभ न करें।
 – 
Marek R
26 नवम्बर 2021, 19:25