我正在用C ++实现自己的链接列表。下面的代码用于链表的迭代器部分。
class Iterator
{
public:
virtual bool operator== (const Iterator &rhs) const = 0;
};
class LinkedListIterator : public Iterator
{
public:
int fieldOnlyLinkedListIteratorHas;
bool operator== (const Iterator &rhs) const
{
return fieldOnlyLinkedListIteratorHas == rhs.fieldOnlyLinkedListIteratorHas;
}
};
我希望有一个Iterator
接口,其中包含许多(将来的)迭代器也可以实现的一些常用方法。
根据您的猜测,在代码中rhs
变量没有该字段,因此代码不会编译。但是我应该将其更改为什么?此代码也不起作用:
bool operator== (const Iterator &rhs) const
{
LinkedListIterator &rhs2 = (LinkedListIterator)rhs;
return fieldOnlyLinkedListIteratorHas == rhs2.fieldOnlyLinkedListIteratorHas;
}
这也不是:
bool operator== (const LinkedListIterator &rhs) const
{
return fieldOnlyLinkedListIteratorHas == rhs.fieldOnlyLinkedListIteratorHas;
}
从那时起LinkedListIterator
类是抽象的。
要在Java中解决此问题,我会使用instanceof
,但如何在C ++中做到这一点?
答案 0 :(得分:0)
dynamic_cast<>将为Java instanceof提供最等效的功能。这要求编译器启用RTTI。
尽管,通常需要使用dynamic_cast <>表示可以改进设计。
bool operator== (const Iterator &rhs) const
{
const LinkedListIterator *rhs2 = dynamic_cast<const LinkedListIterator *>(&rhs);
if (rhs2) {
return fieldOnlyLinkedListIteratorHas == rhs2->fieldOnlyLinkedListIteratorHas;
}
return false; // Is not an instance of LinkedListIterator, therefore must be !=.
}