我正在创建一个程序,其中一部分工作是将标记为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);
}
此更新的信息是否可以帮助您解决我的问题?
Client newClient = Client (first, last, iD);
transactionsTree.Insert(newClient);
我将其更改为:
Client *newClient = new Client (first, last, iD);
transactionsTree.Insert(*newClient);
这很重要,因为我是在堆栈而不是堆中创建一个新对象。