Почему я не могу добавить указатели? - PullRequest
13 голосов
/ 29 мая 2010

У меня есть код, очень похожий на этот:

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

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

Ответы [ 7 ]

53 голосов
/ 29 мая 2010

742 Вечнозеленая терраса + 1 = 743 Вечнозеленая терраса

742 Вечнозеленая терраса - 1 = 741 Вечнозеленая терраса

743 Вечнозеленая терраса - 741 Вечнозеленая терраса = 2

743 Вечнозеленая терраса + 741 Вечнозеленая терраса = ???

38 голосов
/ 29 мая 2010

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

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

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

3 голосов
/ 29 мая 2010

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

2 голосов
/ 29 мая 2010

Другие ответы уже объясняли, почему то, что Вы делаете, не работает, но я предполагаю, что Вы хотите определить типичный 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);
2 голосов
/ 29 мая 2010

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

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

0 голосов
/ 07 февраля 2016

Допустим, у вас есть 2 указателя, и вы знаете, что один или оба из них равны нулю. Вы хотите вернуть тот, который не является нулевым или нулевым, если оба являются нулевыми. Самый простой способ - это суммировать / складывать их. Это лучший случай для суммирования указателей.

0 голосов
/ 30 мая 2010

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

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

 return (this + &right);

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...