यह एक बैंक परियोजना है जो सी ++ सीखते समय मेरे दिमाग में थी और मैं इसे जोड़ रहा हूं क्योंकि मैंने विरासत और पॉइंटर्स सीखे हैं। उपयोगकर्ता एक बैंक टेलर है जो एक नया ग्राहक बना सकता है या मौजूदा ग्राहक के लेनदेन की प्रक्रिया कर सकता है।
एक 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_ */
1 उत्तर
यह वास्तव में एक संदर्भ मुद्दा प्रतीत होता है। अपने process_customer
फ़ंक्शन में, बदलें:
// get customer
Bank b;
Customer c = b.get_customer(acctNum);
प्रति:
// get customer
Bank b;
Customer& c = b.get_customer(acctNum);
इस परिवर्तन के बिना, आप ग्राहक की एक प्रति बना रहे हैं और फिर मूल ग्राहक को संशोधित करने के बजाय इस प्रति को संशोधित कर रहे हैं।
cus[0]
लौटते प्रतीत होते हैं। जैसे कि आपको एक पॉइंटर वापस करने की आवश्यकता है, आप केवल यह जांच सकते हैं कि आपको जो ग्राहक मिला है वह यह "डिफ़ॉल्ट ग्राहक 0" था, उदाहरण के लिए आपके process_customer
फ़ंक्शन में उसका खाता नंबर देखकर। यदि आप इसके बजाय nullptr
के माध्यम से नहीं मिली स्थिति को इंगित करना चाहते हैं तो हाँ, संकेत आसान होंगे।
Customer c = (*resultPointer)
), अन्यथा आप एक प्रति को फिर से संशोधित करने के लिए वापस आ गए हैं। या तो पूरे पॉइंटर का उपयोग करने के लिए चिपके रहें (यह रास्ता अधिक समझ में आता है), या (कम स्पष्ट रूप से और अधिक अजीब तरह से), Customer& c = (*resultPointer)
के संदर्भों पर वापस जाएं
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
cus
की घोषणा देख सकते हैं? (जो सभी ग्राहकों का कंटेनर है इसलिए उचित चर नामों का उपयोग करें)vector<Customer> Bank::cus;
आपके विचार सेstatic
कम हो सकता है। हालांकि .h फाइल के बिना कौन सुनिश्चित हो सकता है।double
(या अन्य फ़्लोटिंग पॉइंट) प्रकार का उपयोग न करें (जब तक आप वास्तविक अनुप्रयोग में इस कोड का उपयोग करने की योजना नहीं बनाते हैं, तो बेझिझकdouble
के साथ जारी रखें।double
बेशक, इसे कुछ वास्तविक उत्पादन में न आने दें)।