Форум программистов, компьютерный форум CyberForum.ru

STL вызов метода класса - C++

Восстановить пароль Регистрация
 
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 20:41     STL вызов метода класса #1
Доброго времени суток! У меня есть класс, в нем поле вектор пар, я хочу реализовать метод вывода этого вектора внутри класса, но что-то не получается... Буду благодарен за помощь)

Вот собственно часть кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class Arithmetic{
    private:
        vector<pair<char, int> > coll;
 
    public:
        Arithmetic(string _str){
            for(unsigned i = 0; i < _str.size(); ++i)
                coll.push_back(make_pair(_str[i], 0));
        }
                
                void print(pair<char, int> op){
                    cout << op.first << ": " << op.second << endl;
                }
 
        void get_operation(){
            for_each(coll.begin(), coll.end(), print);
        }
};
выдает ошибку, но подсказки компилятора толку не дали, буду благодарен за помощь и если можно ткнуть носом в корень проблемы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 20:50     STL вызов метода класса #2
По-моему тут нужно использовать адаптер указателя на функцию ptr_fun. Ведь STL заточена под функциональный объекты. Еще лучше сделать функцию print статической
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class Arithmetic{
    private:
        vector<pair<char, int> > coll;
 
    public:
        Arithmetic(string _str){
            for(unsigned i = 0; i < _str.size(); ++i)
                coll.push_back(make_pair(_str[i], 0));
        }
 
                static
                void print(pair<char, int> op){
                    cout << op.first << ": " << op.second << endl;
                }
 
        void get_operation(){
            for_each(coll.begin(), coll.end(), std::ptr_fun(Arithmetic::print));
        }
};
 
int main()
{
   return 0;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 20:55  [ТС]     STL вызов метода класса #3
Buckstabue, спасибо, пробовал использовать адаптеры, но без статик не работало, в почему без статик не работало?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:00     STL вызов метода класса #4
yoghurt92, а фиг его знает. Формат вызова метода в C++ имеет вид "объект.имя_метода(аргументы)", а STL внутри функции for_each генерирует что-то другое, не в этом формате
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 21:01     STL вызов метода класса #5
Цитата Сообщение от yoghurt92 Посмотреть сообщение
в почему без статик не работало?
потому что нельзя вызвать метод без объекта
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:02  [ТС]     STL вызов метода класса #6
Buckstabue, да недавно начал STL еще не все уложилось, но смотри, у меня есть еще метод, и фишка со статик не проходит

C++
1
2
3
4
5
6
7
8
9
void oper(char elem){
            for(unsigned j = 0; j < coll.size(); ++j)
                    if(elem == coll[j].first)
                        ++coll[j].second;
        }
 
        void operation(string _str){
            for_each(_str.begin(), _str.end(), ptr_fun(Arithmetic::oper));
        }
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:10     STL вызов метода класса #7
yoghurt92, конечно у тебя это не будет компилиться У статических методов нет доступа к внутренним полям объекта, этим методам не передается указатель this, но можно сделать один финт. Очень плохой финт, не стоит так делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
class Arithmetic{
    private:
        vector<pair<char, int> > coll;
 
    public:
        Arithmetic(string _str){
            for(unsigned i = 0; i < _str.size(); ++i)
               coll.push_back(make_pair(_str[i], 0));
        }
 
 
        static
        void oper(Arithmetic& obj, char elem){
           for(unsigned j = 0; j < obj.coll.size(); ++j)
              if(elem == obj.coll[j].first)
                 ++obj.coll[j].second;
        }
 
        void operation(string _str){
           for_each(_str.begin(), _str.end(), bind1st(ptr_fun(Arithmetic::oper), *this));
        }
};
 
int main()
{
   return 0;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:14  [ТС]     STL вызов метода класса #8
Buckstabue, а как тогда быть?
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:22     STL вызов метода класса #9
yoghurt92, не знаю, зависит от ситуации. Либо вручную обходить коллекцию и вызывать для нее метод, либо создавать нормальный функциональный объект. Я сам в этом не очень опытен. Но в твоем коде, я не вижу безвыходной ситуации. Я считаю, не надо подстраивать свой код под STL, а использовать STL только там, где это удобно
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 21:29     STL вызов метода класса #10
c++11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Arithmetic{
    private:
        typedef vector<pair<char, int> > MyVec;
        vector<pair<char, int> > coll;
 
    public:
        Arithmetic(const string& _str){
            for(string::size_type i = 0; i < _str.size(); ++i)
               coll.push_back(make_pair(_str[i], 0));
        }
 
 
        
        void oper(char elem){
           for(MyVec::size_type j = 0; j < coll.size(); ++j)
              if(elem == coll[j].first)
                 ++coll[j].second;
        }
 
        void operation(const string& _str){
             for_each(_str.begin(), _str.end(), std::bind(&Arithmetic::oper, this, std::placeholders::_1));
        }
};
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:57  [ТС]     STL вызов метода класса #11
ну я думаю тогда лучше уже просто сделать функции без класса, все работает если сделать функциями

Добавлено через 31 секунду
Jupiter, а можно объяснить 3 аргумент в for_each
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 22:19     STL вызов метода класса
Еще ссылки по теме:

Вызов переопределенного метода из методов базового класса C++
Вызов статического метода из другого класса C++
C++ Вызов метода класса через указатель на ноль

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 22:19     STL вызов метода класса #12
http://blog.think-async.com/2010/04/...lustrated.html
для тех у кого слабый английский - хватит и картинок
Yandex
Объявления
16.04.2013, 22:19     STL вызов метода класса
Ответ Создать тему
Опции темы

Текущее время: 10:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru