C ++无法连接两个对象

时间:2014-03-02 14:48:08

标签: c++

我在很长一段时间内没有触及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
}

3 个答案:

答案 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被简单地销毁,因为它就像一个局部变量,并且超出了范围。