提问人:mathematted 提问时间:8/23/2016 最后编辑:mathematted 更新时间:8/23/2016 访问量:60
当我离开方法时,来自静态向量的数据保持不变
Data from a static vector left unchanged when I leave the method
问:
这是我在学习 C++ 时想到的一个银行项目,我 随着我学习继承和指针,一直在添加它。这 用户是可以创建新客户或流程的银行出纳员 现有客户的交易。
A has 和 classes 作为继承的私有字段
从。该类从其私有字段添加/获取客户。Customer
Savings
Checking
Account
Bank
static vector<Customer>
出乎意料的结果是,在“process_transaction”方法中,我可以获取 来自 Vector 的客户并从其帐户中存款/取款,但是一旦我离开该方法并返回它,帐户数据从我初始化它们时起就没有改变。
需要帮助。这是对客户问题的引用?我应该什么时候回来 引用还是指针?
这是代码。在驱动程序类中,我有一个创建客户的方法
/*
* 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::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赞
Smeeheey
8/23/2016
#1
这似乎确实是一个参考问题。在函数中,更改:process_customer
// get customer
Bank b;
Customer c = b.get_customer(acctNum);
自:
// get customer
Bank b;
Customer& c = b.get_customer(acctNum);
如果没有此更改,您将创建客户的副本,然后修改此副本,而不是修改原始客户。
评论
0赞
mathematted
8/23/2016
谢谢你,我知道。我是否需要通过指针返回客户,因为我需要返回 customer-not-found 的值?
0赞
Smeeheey
8/23/2016
好吧,目前,当找不到帐号时,您似乎会返回。因此,您确实需要返回一个指针,您可以检查您获得的客户是否是这个“默认客户 0”,例如通过在您的函数中查看他的帐号。如果您想指示未找到的条件,那么是的,指针会更容易。cus[0]
process_customer
nullptr
0赞
mathematted
8/23/2016
好的,使用指针。这是我的解决方案。我找到了一个匹配的客户并返回(未找到返回一个空指针),我得到了返回值,检查它不是空值并转换回一个值&cus[i]
Customer* resultPointer = ...
Customer c = (*resultPointer);
0赞
Smeeheey
8/23/2016
不要做最后一点(),否则你又会再次修改副本。要么坚持在整个过程中使用指针(这更有意义),要么(不那么明显和更奇怪),回到引用Customer c = (*resultPointer)
Customer& c = (*resultPointer)
0赞
mathematted
8/23/2016
你是对的,现在它无法修改客户。我修复了它,它像我所期望的那样工作。谢谢
上一个:C++ 数组作为引用或指针
评论
cus
vector<Customer> Bank::cus;
可能比你想象的要少。虽然没有.h文件,但谁能确定。static
double
double