Не правильно работает булева функция

209
18 июля 2018, 08:40

Моя функция должна проверять однаковы ли два компонента. Но она всегда false возвращает. Я думаю проблема в этой строчке:

 if (!test1->equals(test2->child(childIndex))) 

но я не знаю как ее по другому переписать

Функция

  bool Test::equals(const Component* comp) const
  {
     const Test* test1 = dynamic_cast<const Test*>(this);
     const Test* test2 = dynamic_cast<const Test*>(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;
  }  
Answer 1

Что именно и как вы собираетесь сравнивать - это у вас надо спрашивать. Что вы сейчас сравниваете - то вам ваша функция и возвращает.

  1. Смущает часть, где вы переходите к просмотру неких test2->child(childIndex), но при этом все равно сравниваете всех их с test1. Мое гадание на кофейной гуще подсказывает мне, что раз уж вы c правой стороны перешли к test2->child(childIndex), то и с левой стороны надо было бы перейти к test1->child(childIndex)

    if (!test1->child(childIndex)->equals(test2->child(childIndex)))
      return false;
    

    Однако возникает вопрос: а значение какого типа у вас возвращает эта функция child()? Подозреваю, что так просто все не получится и именно поэтому вы "не знаете как ее по другому переписать".

  2. Вот это

    const Test* test1 = dynamic_cast<const Test*>(this);
    

    является бессмысленным dynamic_cast, т.е. это пустая операция, эквивалентная

    const Test* test1 = this;
    
  3. Умный компилятор, принимая во внимание пункт 2, может выкинуть проверку

    if ((test1 != nullptr) && ...
    

    из первого if, т.к. this никогда не может быть нулевым указателем. Поэтому если у вас test1->child(childIndex) может вернуть нулевой указатель, то не надейтесь, что эта проверка вас защитит.

Answer 2
        if (!test1->child(childIndex)->equals(test2->child(childIndex)))
           return false;
READ ALSO
Межпроцессный обмен данными

Межпроцессный обмен данными

Создать комплект из3-х совместно работающих исполняыемых модулей (exe) a

212
ошибка с vector push_back

ошибка с vector push_back

Есть 2 класса А и В нужно создать контейнер отдельно для каждого класса через метод create который template котрый заполняет контейнер типом в зависимости...

187