【问题标题】:c++ retrieving object from treec ++从树中检索对象
【发布时间】:2018-03-08 16:50:47
【问题描述】:

我正在从事一个项目,其中我有一个帐户类,用于存储不同资金的余额。每个账户对象有 10 个资金,它们从 0 开始,可以进行存款、取款和转账等交易。我需要在添加这些帐户时将它们存储在二叉搜索树中,并且我的检索功能存在问题。代码如下:

bool Retrieve(const int & acctNum, Account* acctPtr)
{
    if (Search(root, acctPtr, acctNum))
        return true;
    else
        return false;
}

bool Search(Node* temp, Account* acctPtr, int acctNum)
{
    if (temp == NULL) {
        return false;
    }
    else if (temp->pAcct->getAcct() == acctNum)
    {
        acctPtr = temp->pAcct;
        return true;
    }
    else if (acctNum <= temp->pAcct->getAcct())
    {
        return Search(temp->left, acctPtr, acctNum);
    }
    else
    {
        return Search(temp->right, acctPtr, acctNum);
    }
}

我遇到的问题是当我存入帐户然后检索并尝试提取时,它没有给我相同的帐户。相反,它只是尝试从余额为 0 的账户中提款。我的意图是让 acctPtr 指向正确的帐户来进行转账/取款/存款。以下是我如何从用于完成事务的不同类调用检索:

    if (transType == "D")
    {
        iss >> acctNum >> amt;
        fund = parseCommand(acctNum);
        acctNum = acctNum.substr(0, acctNum.length() - 1);

        Account * d = new Account("name", stoi(acctNum));
        if (bST->Retrieve(stoi(acctNum), d))
        {
            d->deposit(fund, amt);
            cout << d->getFundBalance(fund) << endl; //for checking, will remove
        }
    }
    else if (transType == "W")
    {
        iss >> acctNum >> amt;
        fund = parseCommand(acctNum);
        acctNum = acctNum.substr(0, acctNum.length() - 1);

        Account * wD = new Account("name", stoi(acctNum));
        if (bST->Retrieve(stoi(acctNum), wD))
        {
            wD->withdraw(fund, amt);
            cout << wD->getFundBalance(fund) << endl; //for checking, will remove
        }
    }

上面的 if 语句只是检查给定时间的交易类型。

【问题讨论】:

  • 你觉得这条线有什么作用? acctPtr = temp-&gt;pAcct;(提示:acctPtr 是什么?)
  • 感谢阅读链接,对以后的项目很有帮助。我对这一行的意图是将 Account 对象的指针设置为指向在搜索中找到的特定对象的指针。这样,当我进行交易时,它会修改检索到的值。
  • 尝试在此处设置断点;检查它的值......然后越过返回,然后再次检查它的值
  • 我能够使用给定的解决方案来解决它。谢谢大家的帮助,我还在学习指针的概念!

标签: c++ pointers tree binary-search-tree


【解决方案1】:

在您的 Search 函数中,您使用参数 acctPtr 作为输出(您为其分配了一个新值)。

但是你的指针不是输出参数。

您应该使用 Account** 或 Account*&。

你将不得不像这样使用 Retrieve 方法:

Account* d = NULL;
if(bST->Retrieve(stoi(acctNum),&d /* or just d if Account*& */))
{ ... }

如果你使用Account**版本,别忘了给指针赋值

*acctPtr = temp->pAcct;

【讨论】:

  • 感谢您的帮助,这解决了我的问题。我还是新手,所以我很感激你的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2012-05-05
相关资源
最近更新 更多