Почему я не могу добавить указатели?

У меня очень похожий код:

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 указателя, и вы знаете, что один или оба из них равны нулю. Вы хотите вернуть тот, который не является нулевым или нулевым, если оба значения равны нулю. Самый простой способ - суммировать их. Это пример проперы для суммирования указателей.