Почему я не могу добавить указатели?
У меня очень похожий код:
LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator+(const Iterator& right)const
{
return (this + &right);//IN THIS PLACE I'M GETTING AN ERROR
}
LINT_rep::Iterator::difference_type LINT_rep::Iterator::operator-(const Iterator& right)const
{//substracts one iterator from another
return (this - &right);//HERE EVERYTHING IS FINE
}
err msg: Error 1 error C2110: '+' : cannot add two pointers
Почему я получаю ошибку только в одном месте, а не в обоих?
Ответы
Ответ 1
В C++ запрещено добавление указателя, вы можете вычесть только два указателя.
Причиной этого является то, что вычитание двух указателей дает логически объяснимый результат - смещение в памяти между двумя указателями. Аналогичным образом вы можете вычесть или добавить целочисленное число в/из указателя, что означает "переместить указатель вверх или вниз". Добавление указателя на указатель - это то, что трудно объяснить. Что представит результирующий указатель?
Если вам явно нужен указатель на место в памяти, адрес которого является суммой некоторых других двух адресов, вы можете наложить два указателя на int
, добавить int
s и отбросить назад указатель. Помните, однако, что это решение требует огромной заботы об арифметике указателя и что-то, чего вы действительно никогда не должны делать.
Ответ 2
742 Evergreen Terrace + 1 = 743 Evergreen Terrace
742 Evergreen Terrace - 1 = 741 Evergreen Terrace
743 Evergreen Terrace - 741 Evergreen Terrace = 2
743 Evergreen Terrace + 741 Evergreen Terrace =???
Ответ 3
Вычитание двух указателей дает вам расстояние между ними. Каким будет результат добавления двух указателей?
Ответ 4
Я полагаю, что в вашем примере результатом, который вы ожидали, было добавление или вычитание указателя на смещение, которое нужно переместить, а не на другой указатель.
В С++ вы можете вычесть 2 указателя (получение смещения в памяти между ними) или добавить указатель на целочисленное значение (перемещение указателя на другую ячейку памяти, увеличивающуюся на значение * sizeof (object_class)). Просто добавление 2 указателей не имеет смысла в С++, но если вы уверены, что хотите добавить 2 адреса расположения ячеек памяти, просто добавьте их как значения без знака (используя тип).
Ответ 5
Другие ответы объяснили, почему, то, что вы делаете, не работает, но я предполагаю, что вы хотите определить типичный operator+
для итератора, но потерялись в этой попытке.
Оба указателя и стандартные итераторы произвольного доступа позволяют продвигать указатель или итератор на интегральное значение. В случае итераторов определяется operator+
, который принимает целочисленное значение в качестве аргумента и возвращает итератор.
LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance) const;
Вы можете определить такой оператор как метод, но этот метод позволит вам написать
iterator + distance
но не
distance + iterator
Чтобы сделать добавление коммутативным, вы должны определить функцию друга, не являющуюся членом, которая принимает расстояние в качестве первого параметра и объект-итератор в качестве второго
friend LINT_rep::Iterator LINT_rep::Iterator::operator+(int distance, const LINT_rep::Iterator & rhs);
Ответ 6
Почему я получаю ошибку в одном месте, а не в обоих?
Даже если вам было разрешено добавить два указателя, это:
return (this + &right);
не укажет нигде. Подумайте об этом - это может быть что-то вроде 0x00123456, и & right будет где-то в том же диапазоне (0x00000000..0x80000000 - например, 0x00321321). Если вы их добавите, результирующий адрес будет указывать очень далеко от обеих переменных (0x00123456 + 0x00321321 == 0x00444777, что будет слишком далеко от обоих "this" и & right), вы можете попасть в зарезервированную память (0x8xxxxxxx на выигрыше) и т.д. Кроме того, указатели могут переполняться. Что (возможно), почему это запрещено.
Если вы хотите добавить что-то в указатель, добавьте integer.
Ответ 7
Допустим, у вас есть 2 указателя, и вы знаете, что один или оба из них равны нулю. Вы хотите вернуть тот, который не является нулевым или нулевым, если оба значения равны нулю. Самый простой способ - суммировать их. Это пример проперы для суммирования указателей.