В этом коде есть гораздо более серьезные проблемы, чем вы можете исправить, добавив куда-нибудь const
или typecast.
Результатом этого кода будет в конечном итоге сбой где-то внизлиния, потому что вы передаете указатель на временный.Как только вы закончите со строкой кода, которая вызывает addElement
, указатель останется висящим, и попытка использовать объект, на который он указывает, приведет либо к бессмыслице (если вы читаете объект), либо к ошибкам в стеке (если выперезапись на объект).
Лучший способ переопределить ваш код - это изменить его на
bool Set::addElement(Multinumber newElement) //pass the Multinumber by value
и вызвать addElement
следующим образом:
result.addElement(*setArray[i] + *rhs.setArray[j]);
Обратите внимание, что я исключил все лишние скобки, потому что *
имеет меньший приоритет, чем []
, поэтому круглые скобки вокруг setArray[i]
и setArray[i]
были избыточными.Я думаю, что код более читабелен таким образом.
На самом деле, если я угадаю, что здесь происходит, setArray
- это внутреннее хранилище класса Set
, поэтому его типу потребуетсядолжен быть переопределен с Multinumber**
на Multinumber*
, в этом случае вызов действительно должен быть
result.addElement(setArray[i] + rhs.setArray[j]);
EDIT Ugggh.Ничто из перечисленного на самом деле не позволит вам сохранить ваш полиморфизм.Вам нужно позвонить new Rational
куда-нибудь, и единственное разумное место, о котором я могу подумать, это:
result.addElement( new Rational(*setArray[i] + *rhs.setArray[j]) );
Это будет работать без переопределения Set::addElement
.
Лучшим решением было бы перестроить всю конструкцию, чтобы она не зависела от полиморфизма числовых классов (потому что числовые классы действительно не должны быть обернуты в указатели при большинстве обычных применений).