#cpp
Моя функция должна проверять однаковы ли два компонента. Но она всегда false возвращает. Я думаю проблема в этой строчке: if (!test1->equals(test2->child(childIndex))) но я не знаю как ее по другому переписать Функция bool Test::equals(const Component* comp) const { const Test* test1 = dynamic_cast(this); const Test* test2 = dynamic_cast (comp); if ((test1 != nullptr) && (test2 != nullptr)) { if (test1->name() != test2->name()) return false; if (test1->numChildren() != test2->numChildren()) return false; for (decltype(test1->numChildren()) childIndex = 0; childIndex < test1->numChildren(); ++childIndex) { if (!test1->equals(test2->child(childIndex))) return false; } return true; } return false; }
Ответы
Ответ 1
Что именно и как вы собираетесь сравнивать - это у вас надо спрашивать. Что вы сейчас сравниваете - то вам ваша функция и возвращает. Смущает часть, где вы переходите к просмотру неких test2->child(childIndex), но при этом все равно сравниваете всех их с test1. Мое гадание на кофейной гуще подсказывает мне, что раз уж вы c правой стороны перешли к test2->child(childIndex), то и с левой стороны надо было бы перейти к test1->child(childIndex) if (!test1->child(childIndex)->equals(test2->child(childIndex))) return false; Однако возникает вопрос: а значение какого типа у вас возвращает эта функция child()? Подозреваю, что так просто все не получится и именно поэтому вы "не знаете как ее по другому переписать". Вот это const Test* test1 = dynamic_cast(this); является бессмысленным dynamic_cast, т.е. это пустая операция, эквивалентная const Test* test1 = this; Умный компилятор, принимая во внимание пункт 2, может выкинуть проверку if ((test1 != nullptr) && ... из первого if, т.к. this никогда не может быть нулевым указателем. Поэтому если у вас test1->child(childIndex) может вернуть нулевой указатель, то не надейтесь, что эта проверка вас защитит. Ответ 2
if (!test1->child(childIndex)->equals(test2->child(childIndex))) return false;
Комментариев нет:
Отправить комментарий