所以基本上是这样的。代码可以很好地将对象添加到数组中。但是当我关闭accountFile时,整个数组变为NULL。我怎样才能避免这种情况,以便我可以将数组用于其他事情?
accounts = new Account*[numAccounts];
for (int i = 0; !accountFile.eof(); i++)
{
if (accountFile >> tempAccountType)
{
if (tempAccountType == "Checking")
{
accountFile >> tempAccountNum >> tempBalance >> tempTransFee;
CheckingAccount tempAccount(tempBalance, tempAccountNum, tempTransFee);
accounts[i] = &tempAccount;
}
else
{
accountFile >> tempAccountNum >> tempBalance >> tempIntRate;
SavingsAccount tempAccount(tempBalance, tempAccountNum, tempIntRate);
accounts[i] = &tempAccount;
}
}
}
答案 0 :(得分:1)
当您关闭文件时问题不在于问题是您正在重新启动当本地退出socope时被销毁的本地对象
首先,我将帐户定义为智能指针的向量
std::vector< shared_ptr<Account> >
每次阅读文件时都会创建一个新文件
accounts.push_back( make_shared<SavingsAccount)(tempBalance, tempAccountNum, tempTransFee);
只要矢量存在,就会存在。
答案 1 :(得分:1)
由于您的对象的范围而发生此错误。当tempAccount对象超出其范围时,它将被销毁。试试这个:
//some stuff
if (tempAccountType == "Checking")
{
accountFile >> tempAccountNum >> tempBalance >> tempTransFee;
CheckingAccount *tempAccount=new CheckingAccount(tempBalance, tempAccountNum, tempTransFee);
accounts[i]=tempAccount;
}
else
{
accountFile >> tempAccountNum >> tempBalance >> tempIntRate;
SavingsAccount *tempAccount=new SavingsAccount(tempBalance, tempAccountNum, tempIntRate);
accounts[i] = tempAccount;
}
答案 2 :(得分:1)
std::vector<std::unique_ptr<Account>> accounts;
while(accountFile >> tempAccountType)
{
if(tempAccountType == "Checking")
{
accountFile >> tempAccountNum >> tempBalance >> tempTransFee;
accounts.emplace_back(new CheckingAccount(tempBalance, tempAccountNum, tempTransFee));
}
else
{
accountFile >> tempAccountNum >> tempBalance >> tempIntRate;
accounts.emplace_back(new SavingsAccount(tempBalance, tempAccountNum, tempIntRate));
}
}
1)检查!eof()不够好。我重组了循环
2)使用矢量
3)使用智能指针(在本例中为unique_ptr)
4)不要存储指向本地范围对象的指针。你必须分配
答案 3 :(得分:0)
对象超出范围,因为它们在if块中声明。您通过引用保存它们,因此当它们超出范围时,引用将变为无效。
尝试以下方法:
accounts[i] = tempAccount;
这将调用CheckingAccount
的复制构造函数,它将保存副本而不是引用。