文件关闭后如何避免数组中的对象超出范围?

时间:2013-04-09 17:46:18

标签: c++ arrays polymorphism

所以基本上是这样的。代码可以很好地将对象添加到数组中。但是当我关闭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;
        }
    }
}

4 个答案:

答案 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的复制构造函数,它将保存副本而不是引用。