C ++ STL доступ к члену класса с помощью набора указателей - PullRequest
0 голосов
/ 13 ноября 2011

У меня есть набор указателей на объекты следующего класса:

class name_id {
    public:
        name_id(string name_a, int id_a) { name = name_a; id = id_a; }
        string name;
        int id;
        bool operator<(name_id &);
};

Позже, после заполнения набора, я передаю этот набор функции и пытаюсь получить доступ к полю имени каждого объекта:

void print_by_rank(set<name_id *> &nameIdSet, map<int, int> &votesMap)
{
    vector<string> names;
    vector<string>::iterator names_it;

    set<name_id *>::iterator nameIdSet_it;
    for(nameIdSet_it = nameIdSet.begin(); nameIdSet_it != nameIdSet.end(); ++nameIdSet_it)
        //names.push_back(nameIdSet_it->name);
        cout << nameIdSet_it->name << endl;
}

Однако ни одна из двух нижних строк не скомпилируется.Я получаю следующее сообщение:

g++ -o bobwinner bobwinner.cpp
bobwinner.cpp: In function 'void print_by_rank(std::set<name_id*, std::less<name_id*>, std::allocator<name_id*> >&, std::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >&)':
bobwinner.cpp:68: error: request for member 'name' in '* nameIdSet_it.std::_Rb_tree_const_iterator<_Tp>::operator-> [with _Tp = name_id*]()', which is of non-class type 'name_id* const'

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

Ответы [ 3 ]

5 голосов
/ 13 ноября 2011

Вам нужно разыменовать итератор, чтобы получить указатель. Затем вам нужно разыменовать указатель, чтобы получить сам объект. Так что вы, вероятно, хотите:

cout << (*nameIdSet_it)->name << endl;
0 голосов
/ 13 ноября 2011

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

0 голосов
/ 13 ноября 2011

Вам нужно разыменовать итератор, и он сам дает вам указатель, который вам нужно разыменовать снова:

(*nameIdSet_it)->name
^^^^^^^^^^^^^^^
  this is a pointer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...