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

У меня есть код, очень подобный этому:

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

Почему я получаю ошибку только в одном месте а не в обоих?

13
задан HeadCode 4 January 2017 в 21:10
поделиться

6 ответов

Добавление указателя запрещено в C ++, вы можете вычесть только два указателя.

Причина в том, что вычитание двух указателей дает логически объяснимый результат - смещение в памяти между двумя указателями. Точно так же вы можете вычесть или добавить целое число к указателю / из указателя, что означает «перемещать указатель вверх или вниз». Добавление указателя к указателю - это то, что трудно объяснить. Что будет представлять полученный указатель?

Если по какой-либо причине вам явно понадобится указатель на место в памяти, адрес которого является суммой некоторых других двух адресов, вы можете преобразовать два указателя в int , добавить int s и вернуть указатель. Однако помните, что это решение требует огромной заботы об арифметике указателей, и вам никогда не следует этого делать.

38
ответ дан 1 December 2019 в 17:10
поделиться

Вычитание двух указателей дает расстояние между ними. Каким будет результат добавления двух указателей?

3
ответ дан 1 December 2019 в 17:10
поделиться

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

В C ++ вы можете вычесть 2 указателя (получая смещение в памяти между ними) или добавить указатель на целочисленное значение (перемещение указателя в другую ячейку памяти с увеличением на значение * sizeof (object_class)). Простое добавление 2 указателей не имеет смысла в C ++, но если вы уверены, что хотите добавить адреса 2 ячеек памяти, просто добавьте их как целые числа без знака (используя приведение типов).

2
ответ дан 1 December 2019 в 17:10
поделиться

Почему я получаю ошибку в одном месте, а не в обоих?

Даже если бы вам разрешили добавить два указателя, this:

 return (this + &right);

указывал бы в никуда. Подумайте об этом - this может быть чем-то вроде 0x00123456, а &right будет где-то в том же диапазоне (0x000000..0x80000000 - то есть, например, 0x00321321). Если их сложить, то полученный адрес будет указывать очень далеко от обеих переменных (0x00123456 + 0x00321321 == 0x00444777, что будет слишком далеко от "this" и &right), вы можете попасть в зарезервированную память (0x8xxxxxxx на win) и т.д. Кроме того, указатели могут переполниться. Именно поэтому (возможно) это запрещено.

Если вы хотите добавить что-то к указателю, добавьте целое число.

0
ответ дан 1 December 2019 в 17:10
поделиться

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 Вечнозеленая терраса = ???

54
ответ дан 1 December 2019 в 17:10
поделиться

Другие ответы уже объясняли, почему то, что вы делаете, не работает, но я предполагаю, что вы хотите определить типичный оператор + для итератора, но потерялись в этой попытке.

И указатели, и стандартные итераторы с произвольным доступом позволяют продвигать указатель или итератор на целое значение. В случае итераторов определяется оператор + , который принимает целое значение в качестве аргумента и возвращает итератор.

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);
2
ответ дан 1 December 2019 в 17:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: