Проблема с оперантом указателя с итератором - PullRequest
0 голосов
/ 24 сентября 2018

Если у меня есть класс Rectangle

Class rectangle{
    //attribute
    ....

    //methods
    ...
    void getInfo() const;
}

И main

int main(){
    vector<Rectangle> v;
    for (vector<Rectangle>::const_iterator it = v.begin() ; it != v.end(); ++it){
        it->getInfo();
    }
}

, почему

"it->getInfo();" 

возвращает мне правильное значение для всего векторного содержимого и

"*it->getInfo();"

верните мне ошибку?

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

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018
it->getInfo();

правильно, потому что;итератор и -> разыменовывает его.

*it->getInfo(); incorrect

(*it).getINfo();

вкратце, -> это ярлык для (* it) .getINfo ();в плане написания и лучше читать.

0 голосов
/ 24 сентября 2018

почему

"it-> getInfo ();"

возвращает мне правильное значение для всего векторного содержимого

it является итератором.Итератор может быть разыменован для доступа к элементу, к которому он относится, и operator* и operator-> являются приемлемыми способами разыменования итератора.it->getInfo() совпадает с (*it).getInfo().

и

"* it-> getInfo ();"

вернуть мне ошибку?

operator-> имеет* более высокий приоритет , чем operator*, поэтому приведенное выше выражение оценивается так, как если бы оно было записано как *(it->getInfo()), что не удается, поскольку getInfo() не возвращает тип, который может быть разыменован с operator*.

Даже если компилятор оценил его по-другому, (*it)->getInfo() также потерпит неудачу, поскольку rectangle не перегружен operator->.

я узнал, что итераторыкак указатель ..

НРАВИТСЯ указатели, но не гарантированно являются указателями BE.Все указатели являются итераторами, но не все итераторы являются указателями.

0 голосов
/ 24 сентября 2018

Существует два способа разыменования указателя, один из них - *, а другой - ->, где за последним должен следовать элемент данных или функция-член, связанная со статическим типом объекта-указателя.Пример:

void doStuff(const Rectangle&); 

Rectangle rect{/* ... */};
Rectangle *pointer = &rect;

doStuff(*pointer); // dereference the pointer

const double width = pointer->width(); // dereference and use a width() member function

То же самое относится к итераторам, где эти операторы перегружены.В вашем случае

it->getInfo();
//^^ dereference the iterator

выполняет разыменование на operator ->, в то время как *it->getInfo() пытается разыменовать возвращаемый тип getInfo(), то есть void.Между прочим, getInfo() для функции-члена, возвращающей void, является запутанным именем, вы могли бы подумать об этом.И позвольте мне добавить второе предложение здесь: цикл может быть упрощен диапазоном на основе цикла следующим образом:

for (const Rectangle& rect : v) {
    rect.getInfo();
}

Обратите внимание, что переменная цикла rect является const -сположенной ссылкой, а небольше итератор - следовательно, не нужно ничего разыменовывать.

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