Как вызвать метод класа через итератор?

197
04 октября 2017, 09:45

У меня есть контейнер, типом которого есть мой клас A, контейнер, к примеру, set< class A>.
Я создаю итератор set::iterator iter = set< class A >.begin()
Как мне вызвать метод через итератор?
*iter->myMethod() не работает, почему?

#include <iostream>  
#include<set>  
using namespace std;  
class A
{
private:
    int c, b;
public:
    a( int a1, int b1): c(a1), b(b1){}
    void out() const
    {
        cout << "\na=" << c << ", b = " << b << endl;
    }
    friend ostream& operator<<(ostream &cout, const A &arg);
};
ostream& operator<<(ostream &cout, const A &arg) {
    cout << "\na=" << arg.c << ", b = " << arg.b << endl;
    return cout;
}
int main()
{
    set<A> seta;
    seta.insert(A(1, 2));
    seta.insert(A(1, 7));
    seta.insert(A(1, 8));
    seta.insert(A(2, 2));
    seta.insert(A(14, 2));
    set<A>::iterator iter = seta.begin();
    for (; iter != seta.end(); ++iter)
            cout << (A)*iter;// выкидывает в файл xstddef с кодом ошибки с2678
    *iter->out();    // здесь итератор типа 'A const'  
                     // и он не совместимый с методом A::out()
    system("pause");
    return 0;
}
Answer 1

Вы можете рассматривать итератор как указатель и работать с ним как с указателем. Методы через указатель можно вызывать двумя способами. "Напрямую" с использованием оператора ->

iter->myMethod()

и разыменовывая указатель (через *) и используя оператор точка

(*iter).myMethod()

В вашем коде (если я правильно понял)

*iter->myMethod()

явно происходит попытка использования обоих этих методов

Answer 2

Вот такой код - https://ideone.com/TDOWUT

#include <vector>
#include <iostream>
#include <iomanip>
using namespace std;
class Test
{
public:
    Test(int i):i(i){}
    void out() const { cout << "Test for " << i << endl; }
private:
    int i;
};
int main(int argc, const char * argv[])
{
    vector<Test> s;
    for(int i = 0; i < 10; ++i)
        s.push_back(Test(rand()%100));
    for(auto it = s.begin(); it != s.end(); ++it)
        it->out();
}

Как видите, все работает.

Как вообще вы представляете компиляцию вашего

set::iterator iter = set.begin();

мне непонятно. С одной стороны у вас set - тип, с другой - имя объекта?...

READ ALSO
Как отформатировать время HH:MM

Как отформатировать время HH:MM

Подскажите как получить минуты с 0 если минуты < 10?

265
jquery вставить ссылку

jquery вставить ссылку

Есть товары на странице,у каждого товара есть кнопка "В корзину"Вот код этих кнопок:

255
Вложенность в sass?

Вложенность в sass?

Можно ли при компиляции в SASS убрать вложенность? Или писать код без вложенности? На данный момент это выглядит вот так:

289