Что не так с моим синтаксисом в этом 1-битном фрагменте кода (указатели, ссылки и разыменования, боже) - PullRequest
3 голосов
/ 01 декабря 2010

Код, с которым у меня возникают проблемы, это строка:

result.addElement(&(*(setArray[i]) + *(rhs.setArray[j])));

Оператор + в моем классе перегружен следующим образом (существует множество перегрузок, которые могут уместиться в этом наборе, но все они имеют одинаковый заголовок):

const Rational Rational::operator+(const Rational &rhs) const

Setarrays в приведенном выше коде являются массивами указателей, но оператор + требует ссылки, что может быть проблемой.

AddElement, метод результата, имеет этот заголовок:

bool Set::addElement(Multinumber* newElement)

Multinumber * в заголовке является родительским классом Rational, упомянутым выше. Я не думаю, что какой-либо конкретный код имеет значение. Я почти уверен, что это проблема синтаксиса.

Ошибка моего компилятора:

68: error: invalid conversion from 'const Multinumber*' to 'Multinumber*'

Спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 01 декабря 2010

проблема с const

bool Set::addElement(Multinumber* newElement) должно быть Set::addElement(const Multinumber* newElement)

1 голос
/ 01 декабря 2010

Проблема заключается в том, что addElement ожидает неконстантного значения, когда оператор operator + возвращает константный объект.

Исправление для кода приводит к получению возврата, как указано ниже

addElement ((Multinumber *) & (* (setArray [i]) + * (rhs.setArray [j])));

Если вы не хотите выполнять приведение типа, так как приведение может нарушить цель проверки типа здесь, тогдаВы должны изменить подпись addElement.Это в зависимости от области вашего проекта может повлиять на то, где и если этот API является открытым и другие разработчики используют его.Изменение подписи также повлияет на них.

Так что выбирайте мудро.

1 голос
/ 01 декабря 2010

Ваш operator + возвращает постоянный объект. Однако для addElement требуется неконстантный объект, из которого исходит ошибка вашего компилятора. По сути, addElement говорит вам, что он может изменять ваш Multinumber по своему усмотрению, но operator + начинает вам не изменять возвращаемое значение.

Вы должны просто вернуть неконстантный объект, если только для этого нет веской причины. В конце концов, вы не вернете ссылку.

Конечно, если данные в вашем наборе должны быть постоянными и никогда не будут изменены, вы также можете заставить addElement взять указатель const и убедиться, что он внутренне работает с указателями const ВЕЗДЕ. *

0 голосов
/ 01 декабря 2010

В этом коде есть гораздо более серьезные проблемы, чем вы можете исправить, добавив куда-нибудь 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.


Лучшим решением было бы перестроить всю конструкцию, чтобы она не зависела от полиморфизма числовых классов (потому что числовые классы действительно не должны быть обернуты в указатели при большинстве обычных применений).

...