类中的C ++字符串在构造后将变为空

问题描述 投票:0回答:1

我正在创建一个程序,其中一部分工作是将标记为Client()的类对象存储在二进制树中。我用

在switch语句中创建对象
Client newClient = Client (first, last, iD);
transactionsTree.Insert(newClient);

switch语句处于读取数据的循环中,因此在执行这种情况并且程序继续执行之后,该类中的字符串将设置为空的“”字符串。我在逐步调试中发现了这一点,并且在这种情况下,一旦执行块,字符串就会变为空。放入该类的任何其他数据都将保留,但这些字符串将不会保留。即使我在Client.h文件中声明了这些字符串名称,在创建开关的情况下它们仍然为空。创建上面显示的newClient的代码位于Transactions.cpp中,transactionsTree是BSTree.cpp的类对象,还有Client.cpp,所有这些类共享一个连接,但是我假设我的问题必须这样做我将对象插入二叉树的方式。

这是带有switch语句大小写的代码:

case 'O': // open an account
            {
                string first = list.front();
                list.pop();
                string last = list.front();
                list.pop();
                stringstream getiD(list.front()); // transfer string to int
                list.pop();
                int iD = 0;
                getiD >> iD; // transferring string to int

                if (transactionsTree.Retrieve(iD)) // if Client is already in tree, prints error message
                {
                    cout << "ERROR: Account " << iD << " is already open. Transaction refused." << endl;
                }
                else // else creates new Client
                {
                    Client newClient = Client (first, last, iD);
                    transactionsTree.Insert(newClient);
                }

                break;
            }

这是我对二叉树的插入方法:

void BSTree::Insert(Client &newClient)
{
    if (isEmpty())
    {
        Node *newNode = new Node(newClient);
        this->root = newNode;
    }
    else
        add(this->root, newClient);
}

BSTree::Node* BSTree::add(Node *node, Client &newClient) // helper function for Insert()
{
    if (node == nullptr)
        {
            Node *newNode = new Node(newClient);
            return newNode;
        }
    if (newClient.clientID < node->pClient->clientID)
        node->left = add(node->left, newClient);
    else
        node->right = add(node->right, newClient);
}

edit1:经过进一步检查,尽管在这里是保留的字符串向量,但是在标头或构造函数中声明的类中的所有字符串均不保留。我也有一个字符串数组,整个数组都在Client.cpp的标题中声明,但是当我尝试从任何Client对象中打印出任何字符串时,它只会打印出一个地址。

edit2:我将问题分为两个区域,一个区域尝试使用以下命令访问树中的客户端:

Client *ptrClient; // create pointer to access the Client once found
                        ptrClient = &transactionsTree.getClient(iD);

和我的二叉树类中的getClient方法中的两个:

Client& BSTree::getClient(int id) // returns a Client object from the tree to process() in Transactions.cpp
{
    return getTheClient(this->root, id);
}

Client& BSTree::getTheClient(Node * node, int iD) // helper function for getClient that returns a Client object in the tree
{
// no need for the if condition of iD not being found because I check if the iD is in the tree before this function is executed
    if (node->pClient->clientID == iD)
    {
        cout << node->pClient->firstName << " PRINTED HERE~~~~~~~~~~~~~" << endl;
        return *node->pClient; // return client if found
    }
    if (iD < node->pClient->clientID)
        return getTheClient(node->left, iD);
    else
        return getTheClient(node->right, iD);
}

此更新的信息是否可以帮助您解决我的问题?

c++ string class switch-statement binary-tree
1个回答
0
投票
Client newClient = Client (first, last, iD); transactionsTree.Insert(newClient);

我将其更改为:

Client *newClient = new Client (first, last, iD);
transactionsTree.Insert(*newClient);

这很重要,因为我是在堆栈而不是堆中创建一个新对象。

© www.soinside.com 2019 - 2024. All rights reserved.