Интерфейс реализации класса C ++, интерфейс имеет метод, принимающий любой класс, реализующий этот интерфейс - PullRequest
0 голосов
/ 10 февраля 2019

Я реализую свой собственный связанный список в 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 является абстрактным.

Чтобы решить эту проблему вЯ бы использовал instanceof но как это сделать на С ++?

1 Ответ

0 голосов
/ 10 февраля 2019

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 !=.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...