我已经创建了一个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;
}
}
答案 0 :(得分:0)
我不知道迭代器应该在BST课程中做什么,无论如何......
(1)我不知道什么是operator++ (T)
;据我所知,作为一个类的方法,operator++
可以是签名operator++()
(预增量)或operator++(int)
(后增量);我想您正在尝试定义一个后增量运算符(因为您添加了一个伪参数,因为您返回了Iterator
的副本,而不是引用)但伪参数应该是{{1 },而不是类型int
(2)预增量或后增量,T
应该修改对象;您的操作员不会修改它:它创建孤独成员(operator++()
)的本地副本并修改本地副本;对root
的顺序调用应该会产生相同的效果,因为它们做同样的事情;我想你的意图是修改成员operator++(T)
,而不是局部变量root
(3)假设(存在伪参数而没有返回类型的引用)你的意图是制作一个后增量运算符,你必须创建一个副本的对象,修改对象和返回 副本;您(不)修改对象并返回对象本身(ptr
),这是预增量运算符的典型行为(在对象中添加一些更改并按引用返回)。
为了简单起见,我想你应该写一些东西
return *this;