BST类的++运算符

时间:2018-03-22 10:49:03

标签: c++ c++11 visual-c++ c++14 c++builder

我已经创建了一个BST类,它有一个根节点,左右节点。它工作得很好。我正在尝试创建一个++运算符迭代器,它可以遍历每个节点并递增它。这是我到目前为止所得到的,我仍然认为它与我的构造函数有关。下面是我在BST类中包含的嵌套Iterator类。我只是cout看它是否正常工作,但它会一直打印出来。

class Iterator
{
private:
    // private iterator state...
    nodeptr root;
public:
    Iterator(nodeptr roots_) : root(roots_) {};
    ~Iterator() {}
    bool operator!=(const Iterator& rhs) const { return (this-> root != rhs.root); }
    bool operator==(const Iterator& rhs) const {
        return (this->root == rhs.root);
    }

    Iterator operator++(T) {
      nodeptr ptr = root;
        if (root == NULL)
        {
            cout << "The tree is empty" << endl;
        }
        else
        {
            if (ptr->left != NULL)
            {
                ptr = ptr->left;
            }
            cout << ptr->data << " ";
            if (ptr->right != NULL)
            {
                ptr = ptr->right;
            }
            else
            {
                cout << "_";
            }
        }

        return *this;
    }
}

1 个答案:

答案 0 :(得分:0)

我不知道迭代器应该在BST课程中做什么,无论如何......

(1)我不知道什么是operator++ (T);据我所知,作为一个类的方法,operator++可以是签名operator++()(预增量)或operator++(int)(后增量);我想您正在尝试定义一个后增量运算符(因为您添加了一个伪参数,因为您返回了Iterator的副本,而不是引用)但伪参数应该是{{1 },而不是类型int

(2)预增量或后增量,T应该修改对象;您的操作员不会修改它:它创建孤独成员(operator++())的本地副本并修改本地副本;对root的顺序调用应该会产生相同的效果,因为它们做同样的事情;我想你的意图是修改成员operator++(T),而不是局部变量root

(3)假设(存在伪参数而没有返回类型的引用)你的意图是制作一个后增量运算符,你必须创建一个副本的对象,修改对象和返回 副本;您(不)修改对象并返回对象本身(ptr),这是预增量运算符的典型行为(在对象中添加一些更改并按引用返回)。

为了简单起见,我想你应该写一些东西

return *this;