यह एक बैंक परियोजना है जो सी ++ सीखते समय मेरे दिमाग में थी और मैं इसे जोड़ रहा हूं क्योंकि मैंने विरासत और पॉइंटर्स सीखे हैं। उपयोगकर्ता एक बैंक टेलर है जो एक नया ग्राहक बना सकता है या मौजूदा ग्राहक के लेनदेन की प्रक्रिया कर सकता है।

एक Customer में निजी क्षेत्र के रूप में Savings और Checking वर्ग हैं जो इनहेरिट करते हैं Account से। Bank वर्ग अपने निजी static vector<Customer> फ़ील्ड से ग्राहकों को जोड़ता/प्राप्त करता है।

अप्रत्याशित परिणाम यह है कि 'process_transaction' विधि में मैं एक ग्राहक को वेक्टर से ला सकता हूं और उसके खातों से जमा/निकासी कर सकता हूं, लेकिन एक बार जब मैं विधि छोड़ देता हूं और उस पर वापस आ जाता हूं तो खातों का डेटा उस समय से नहीं बदला है जब मैंने उन्हें शुरू किया था। .

मदद की ज़रूरत है। यह ग्राहक के मुद्दे का संदर्भ है? मुझे संदर्भ या सूचक द्वारा कब वापस आना चाहिए?

यहाँ कोड है। ड्राइवर वर्ग में मेरे पास ग्राहक बनाने का एक तरीका है

/*
* Create customer from teller input then add the Customer 
* to Bank's private static vector<Customer> field.
*/
int create_customer(){
    cout << "** Create New Customer **\n";
    cout << "Customer Name: ";
    string n = "";
    cin >> n;
    Customer* d = new Customer(n, gen_acct_number());
    Customer c(*d);
    // get opening balances
    double open_ck = 0;
    double open_sv = 0;
    cout << "Opening Balance For Checking: ";
    cin >> open_ck;

    cout << "Opening Balance For Savings: ";
    cin >> open_sv;
    cout << "\n";

    // create and set accounts
    Checking ck(open_ck);
    Savings sv(open_sv);
    c.set_checking(ck);
    c.set_savings(sv);

    // add customer to bank
    Bank b;
    b.add_customer(c);
    cout << "New Customer: " << c.get_name() << endl;
    cout << "Account Number: " << c.get_acct_number() << endl;
    cout << "\n";
    return 0;

}

मेरे पास ग्राहक को संसाधित करने के लिए ड्राइवर वर्ग में एक और तरीका है। एक बार जब मैं इस पद्धति को छोड़ देता हूं तो ग्राहक के खाते अपरिवर्तित रहते हैं, लेकिन अन्यथा काम करते हैं।

/*
* Fetch customer by account number from  Bank's private static 
* vector<Customer> and perform transactions on Customer's accounts
* until teller has finished processing the customer.
*/
int process_customer(){
    cout << "** Process Transaction **\n";
    cout << "Account Number: ";
    int acctNum = 0;
    cin >> acctNum;
    cout << "\n";

    // get customer
    Bank b;
    Customer c = b.get_customer(acctNum);

    //if(c* == NULL){
    //  cout << "Error: Customer Not Found.\n";
    //  return 0;
    //}

    bool flag = true;
    while(flag){
        cout << c.get_name() << " #" << c.get_acct_number() << ": ";

        cout << "Select a transaction.\n";
        cout << "1. Withdrawl\n";
        cout << "2. Deposit\n";
        cout << "3. Check Balance\n";
        cout << "4. Quit\n";
        cout << "> ";
        int choice = 0;
        cin >> choice;
        cout << "\n";

        double amt = 0;
        int which = 0;
        switch(choice){
        case 1:{    // WITHDRAWL

            cout << "Withdrawl From: \n";
            cout << "1. Checking \n2. Savings \n";
            cout << "> ";
            cin >> which;
            cout << "\n";
            cout << "Amount: ";
            cin >> amt;
            cout << "\n";

            if(which == 1){
                cout << "Old Balance: " << c.get_checking().get_balance() << endl;
                c.get_checking().withdrawl(amt);
                cout << "New Balance: " << c.get_checking().get_balance() << endl;
                cout << "\n";
            }else if (which == 2){
                cout << "Old Balance: " << c.get_savings().get_balance() << endl;
                c.get_savings().withdrawl(amt);
                cout << "New Balance: " << c.get_savings().get_balance() << endl;
                cout << "\n";
            }else{
                break;
            }
            break;
        }
        case 2:{    // DEPOSIT

            cout << "Deposit Into: \n";
            cout << "1. Checking \n2. Savings \n";
            cout << "> ";
            cin >> which;
            cout << "\n";

            cout << "Amount: ";
            cin >> amt;
            cout << "\n";
            if(which == 1){
                cout << "Old Balance: " << c.get_checking().get_balance() << endl;
                c.get_checking().deposit(amt);
                cout << "New Balance: " << c.get_checking().get_balance() << endl;
                cout << "\n";

            }else if (which == 2){
                cout << "Old Balance: " << c.get_savings().get_balance() << endl;
                c.get_savings().deposit(amt);
                cout << "New Balance: " << c.get_savings().get_balance() << endl;
                cout << "\n";
            }else{
                break;
            }
            break;
        }
        case 3:{    // CHECK BALANCE

            cout << "Checking " << c.get_checking().get_balance() << endl;
            cout << "Savings  " << c.get_savings().get_balance() << endl;
            cout << "\n";
            break;
        }
        default:{   // EXIT

            flag = false;
            break;
        }
        }
    }

    return 0;
}

बैंक वर्ग।

Bank::Bank(){}

Customer& Bank::get_customer(int acct_number) {

    for(unsigned i = 0; i < cus.size(); i++){
        if(cus[i].get_acct_number() == acct_number){
            return cus[i];
        }
    }
    return cus[0];
}
void Bank::add_customer(Customer c){
    cus.push_back(c);
}

/* Disabled. I want to pass an account to these methods.
* 
* void Bank::deposit(double amt, Account& a){
*   a.deposit(amt);
* }
* void Bank::withdrawl(double amt, Account& a){
*   a.withdrawl(amt);
* }
* double Bank::check_balance( Account& a){
*   return a.get_balance();
* }
*/


vector<Customer> Bank::cus;

Bank.h

#ifndef BANK_H_
#define BANK_H_


#include "../include/Customer.h"
#include <string>
#include <vector>
using namespace std;

class Bank{

public:
    Bank();
    Customer& get_customer(int acct_number);
    void add_customer(Customer c);
    void deposit(double amt,  Account& a);
    void withdrawl(double amt,  Account& a);
    double check_balance( Account& a);
private:
    static vector<Customer> cus;
};



#endif /* BANK_H_ */
0
mathematted 23 अगस्त 2016, 17:00
क्या हम cus की घोषणा देख सकते हैं? (जो सभी ग्राहकों का कंटेनर है इसलिए उचित चर नामों का उपयोग करें)
 – 
Khalil Khalaf
23 अगस्त 2016, 17:03
vector<Customer> Bank::cus; आपके विचार से static कम हो सकता है। हालांकि .h फाइल के बिना कौन सुनिश्चित हो सकता है।
 – 
infixed
23 अगस्त 2016, 17:08
आपकी वर्तमान समस्या के लिए एक असंबंधित टिप्पणी: राशियों के लिए double (या अन्य फ़्लोटिंग पॉइंट) प्रकार का उपयोग न करें (जब तक आप वास्तविक अनुप्रयोग में इस कोड का उपयोग करने की योजना नहीं बनाते हैं, तो बेझिझक double के साथ जारी रखें। double बेशक, इसे कुछ वास्तविक उत्पादन में न आने दें)।
 – 
Ped7g
23 अगस्त 2016, 17:49

1 उत्तर

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

यह वास्तव में एक संदर्भ मुद्दा प्रतीत होता है। अपने process_customer फ़ंक्शन में, बदलें:

// get customer
Bank b;
Customer c = b.get_customer(acctNum);

प्रति:

// get customer
Bank b;
Customer& c = b.get_customer(acctNum);

इस परिवर्तन के बिना, आप ग्राहक की एक प्रति बना रहे हैं और फिर मूल ग्राहक को संशोधित करने के बजाय इस प्रति को संशोधित कर रहे हैं।

1
Smeeheey 23 अगस्त 2016, 17:06
धन्यवाद, मुझे पता था। क्या मुझे ग्राहक को पॉइंटर द्वारा वापस करने की आवश्यकता है क्योंकि मुझे ग्राहक के लिए एक मूल्य वापस करने की आवश्यकता नहीं है?
 – 
mathematted
23 अगस्त 2016, 17:20
खैर इस समय खाता संख्या नहीं मिलने पर आप cus[0] लौटते प्रतीत होते हैं। जैसे कि आपको एक पॉइंटर वापस करने की आवश्यकता है, आप केवल यह जांच सकते हैं कि आपको जो ग्राहक मिला है वह यह "डिफ़ॉल्ट ग्राहक 0" था, उदाहरण के लिए आपके process_customer फ़ंक्शन में उसका खाता नंबर देखकर। यदि आप इसके बजाय nullptr के माध्यम से नहीं मिली स्थिति को इंगित करना चाहते हैं तो हाँ, संकेत आसान होंगे।
 – 
Smeeheey
23 अगस्त 2016, 17:23
अंतिम कार्य न करें (Customer c = (*resultPointer)), अन्यथा आप एक प्रति को फिर से संशोधित करने के लिए वापस आ गए हैं। या तो पूरे पॉइंटर का उपयोग करने के लिए चिपके रहें (यह रास्ता अधिक समझ में आता है), या (कम स्पष्ट रूप से और अधिक अजीब तरह से), Customer& c = (*resultPointer) के संदर्भों पर वापस जाएं
 – 
Smeeheey
23 अगस्त 2016, 18:05
आप सही हैं, अब यह ग्राहक को संशोधित करने में विफल रहता है। मैंने इसे ठीक किया और यह काम करता है जैसा मैं उम्मीद करता हूं। धन्यवाद
 – 
mathematted
23 अगस्त 2016, 18:19