我在很长一段时间内没有触及c ++,当我遇到这个问题时,我试图制作一个红黑树模板。我想添加一个元素,然后cout这个东西。但是当我切换功能时,我无法使用相同的RBT变量。它变成了一个全新的变量。我不知道为什么这不起作用
#include <iostream>
#include <string>
#include "redblacktree.h"
using namespace std;
int menu();
void addElement(RedBlackTree<int> RBT);
void peak(RedBlackTree<int> RBT);
int main()
{
int option=-1;
RedBlackTree<int> RBT;
while(option != 99)
{
option=menu();
switch(option)
{
case 1:
addElement(RBT);
break;
case 3:
peak(RBT);
break;
}
}
return 0;
}
int menu()
{
int option;
cout<<"1. Add element"<<endl;
cout<<"3. Peek"<<endl;
cin>>option;
cin.ignore();
return option;
}
void addElement(RedBlackTree<int> RBT)
{
int value;
cout<<"Enter element: "<<endl;
cin>>value;
cin.ignore();
RBT.insert(value);
//cout<<RBT.printRoot()<<endl; //works
}
void peak(RedBlackTree<int> RBT)
{
cout<<RBT.printRoot()<<endl; //does not work
}
答案 0 :(得分:1)
目前,您已将RedBlackTree<int> RBT
传递给addElement()
和peak()
。通过C ++的pass-by-value特性,实例在传入函数之前被复制。因此,这些功能可用于临时副本。
要使函数在传入的实例上起作用,您应该通过引用传递参数。在这种情况下,请将RedBlackTree<int>&
传递给addElement()
和peak()
。
此外,既然你说你的peak()
不起作用,你应该检查你的复制构造函数是否正确。
答案 1 :(得分:1)
您希望通过引用传递:
void addElement(RedBlackTree<int> &RBT);
void peak(RedBlackTree<int> &RBT);
这不会创建对象的副本。
答案 2 :(得分:0)
您必须通过引用传递,因为您通过添加新元素来修改对象。
在你的解决方案中,在addElement的末尾,RBT被简单地销毁,因为它就像一个局部变量,并且超出了范围。