Если не использовать векторный итератор, C ++ - PullRequest
1 голос
/ 07 сентября 2011

Я пытаюсь перебрать вектор, содержащий указатель на объект типа Student.Объявление вектора выглядит следующим образом: static vector<Student*> students;

Во всяком случае, я пытаюсь использовать итератор в функции pickWinners ():

vector<Student*>::iterator p1 = students.begin();
vector<Student*>::iterator p2 = p1;
p2++;

Как я понимаю, p1 является указателем науказатель на ученика.Но когда я пытаюсь это сделать (например):

*p1->print();

, я получаю следующую ошибку:

Hire.cpp: 192: ошибка: запрос члена 'print' in '* p1 .__ gnu_cxx :: __ normal_iterator <_Iterator, _Container> :: operator-> с _Iterator = Student **, _Container = std :: vector> ', который относится к неклассному типу' Student * ', make: * [Hire.o] Ошибка 1

Это не имеет никакого смысла для меня.Я знаю, что проблема не в печати ().Я пробовал

Student *student = students.at(0);
student->print();

и все работало идеально.Я тут довольно невежественен, есть идеи?Спасибо!

Ответы [ 3 ]

10 голосов
/ 07 сентября 2011

Желаемый результат будет достигнут

(*p1)->print();

В вашем случае код анализируется как *(p1->print());, потому что operator-> имеет более высокий приоритет, чем operator*, см., Например, таблица приоритетов в Википедии

3 голосов
/ 07 сентября 2011

Вы, вероятно, хотите / нуждаетесь (*p1)->print(); Как есть, оно будет проанализировано, как если бы вы написали *(p1->print());

Скорее всего, 20: 1, вам действительно лучше хранить Student с вместо Student * с.

Как только вы это исправите, вы, вероятно, захотите избавиться от Student::print() и вместо этого предоставить std::ostream &operator<<(std::ostream &, Student const &);. Имея это в виду, вы можете сделать что-то вроде:

std::cout << *p1;

и (например) печать всего массива работает примерно так:

std::copy(students.begin(), students.end(), 
          std::ostream_iterator<Student>(std::cout, "\n"));
1 голос
/ 07 сентября 2011

p1 является итератором, и для правила приоритета компилятор интерпретирует его следующим образом:

*(p1->print());

Но то, что вы хотите:

(*p1)->print();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...