类成员变量永远不会在新类中初始化

时间:2014-07-10 16:13:10

标签: c++ class variables header-files

我有一个程序,当一个类从另一个类调用一个函数来访问或更改其成员变量时,没有任何反应。即使我要调用setName(“John”)函数然后尝试使用getName()函数获取名称,该字符串将返回空,与所有其他变量类型相同。 我的课程功能有问题吗?我是c ++的新手,这是我第一次在一个程序中使用多个头文件和类文件,所以这样的小东西往往会让我...

这是我的第一个标题类:

class Customer{
private:
    string firstName;
    string lastName;
    string adress;
    long socialSecurity;
    float interstRate;
    float balance;
    string accountType;

public:
    Customer(){
        this->firstName = "";
        this->lastName = "";
        this->adress = "";
        this->socialSecurity = 0;
        this->interstRate = 0.0;
        this->balance = 0.0;
        this->accountType = "";
    };
    Customer(string first, string last, string adrs, long sociNum, float rate, float bal, string type){
        this->firstName = first;
        this->lastName = last;
        this->adress = adrs;
        this->socialSecurity = sociNum;
        this->interstRate = rate;
        this->balance = bal;
        this->accountType = type;
    };

public:
    void updateBalance();
    void setName(string first, string last);
    string getFirstName();
    string getLastName();
    void setAdress(string adrs);
    //other methods omitted to preserve length
};

第二个标题:

#include <vector>
#include "Customer.h"

class Bank{
public:
    void createAccount( Customer );
    void printAccount( vector<Customer>&, int );
    void print_ALL_Acounts( vector<Customer>& );
    int search( vector<Customer>&);
};

银行类内部的功能示例:

void Bank::createAccount(Customer newCust){
    string first, last, adress, accountT;
    long ssn;
    float rate, balance;

    cout<< "Please Specify A First And Last Name: ";
    cin>> first >> last;
    newCust.setName(first, last);

    cout<< "Please Specify An Adress: ";
    getline(cin, adress);
    cout << endl;
    newCust.setAdress(adress);

    cout<< "Please Specify A Social Security Number: ";
    cin>> ssn;
    newCust.setSocialSecurity(ssn);

    cout<< "Please Specify An Account Type: ";
    cin>> accountT;
    newCust.setAccountT(accountT);

    cout<< "Please Specify An Interest Rate: ";
    cin>> rate;
    newCust.setInterest(rate);

    cout<< "Please Specify An Account Balance: ";
    cin>> balance;
    newCust.setBalance(balance);
}

客户类中的功能示例:

void Customer::updateBalance()
{
    balance = balance*interstRate;
}
void Customer::setName(string first, string last){
    firstName = first;
    lastName = last;
}
string Customer::getFirstName(){
    return firstName;
}
string Customer::getLastName(){
    return lastName;
}
void Customer::setAdress(string adrs){
    adress = adrs;
}

最后,这就是我在主类中称呼它们的方式:

Bank bank;
Customer account;
vector<Customer> accountList;

bank.createAccount(account);
accountList.push_back(account);

然后如果我要打印我创建的帐户列表,他们都会显示空值。 因此,任何人都可以指出并解释我做错了什么?

2 个答案:

答案 0 :(得分:1)

当您将account传递给createAccount时,您将按值传递它。这意味着您将其复制到函数中并修改副本。您传递的account变量未经修改。

目前,一个简单的解决方案是通过引用传递Customer

void Bank::createAccount(Customer& newCust);

引用类型(带&)允许您修改传递给函数的原始对象。

但是,我只会认为这是一个临时解决方案,因为看起来你的架构有点奇怪。我希望Bank跟踪accountList(作为成员),然后createAccount最后会push_back

另外,请考虑一下您的命名约定。我很困惑地看到名为Customer的{​​{1}}变量。并且“地址”拼写为两个D。

答案 1 :(得分:0)

您需要通过引用传递Customer实例以获取正确设置的值

void Bank::createAccount(Customer& newCust) { 
                              // ^
    // ...
}

其他地方可能也一样。

否则,您只需更改此函数堆栈上由Customer实例组成的副本。原件将保持不变。