我对C ++很新,并且正在编写银行项目来练习。我使用列表来保存bank_account
类型的指针,其中包含成员first_name
,last_name
和balance
。在列表中添加条目后,我试图获取我添加的元素,但是当我到达get()
方法时,名称不再存在。我认为这是因为指针超出范围并且在离开循环时可能被破坏。
bank.cpp:
bank_account* bank::get(const string &f_name,
const string &l_name,
const int &account_number)
{
for (auto it = bank::accounts.begin(); it != bank::accounts.end(); it++){
bank_account curr_ba = **it; //dereference twice
std::cout << "Curr fname: " << curr_ba.first_name << std::endl;
std::cout << "Curr lname: " << curr_ba.last_name << std::endl;
std::cout << "Acct num: " << curr_ba.acct_num << std::endl;
if (curr_ba.get_first_name() == f_name &&
curr_ba.get_last_name() == l_name &&
curr_ba.get_account_number() == account_number) {
return *it;//dereferences the pointer, which leaves another pointer
}
}
在main.cpp:
bank bank;
while(more_user_input){
//get first_name and last_name, assign account_number
bank_account ba(first_name, last_name);
bank_account *ba_ptr = &ba;
bank.add_acct(ba_ptr);
//Withdraw and deposit amts, add more people, etc.
}
//get first name, last name, account number of desired person
bank_account *ba = (bank.get(f_name, l_name, acct_number));
这打印:
对于每个条目Curr fname:
,Curr lname:
,Acct num: some #
,好像fname
和lname
已被破坏(我没有提供析构函数 - 使用默认值)。帐号保持不变。但是,如果我在main.cpp:
bank_account ba(first_name, last_name);
bank_account *ba_ptr = &ba;
到
bank_account *ba_ptr = new bank_account(first_name, last_name);
它有效,我找到了元素,但我很困惑为什么。我知道new
将事物添加到堆而不是堆栈中,这可能是列表中指针似乎超出范围的部分原因吗?除了vector
对于大量访问更好的想法,并且我没有delete
我的示例中的指针(并且应该使用智能指针),如果任何人都可以脱掉这一事实对于为什么一个有效,另一个无用,我真的很感激它。我是否正确在第一种情况下在列表中的指针上调用析构函数?