Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yoghurt92
375 / 346 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
#1

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

16.04.2013, 20:41. Просмотров 639. Ответов 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
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);
        }
};
выдает ошибку, но подсказки компилятора толку не дали, буду благодарен за помощь и если можно ткнуть носом в корень проблемы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2013, 20:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос STL вызов метода класса (C++):

Вызов метода класса из метода другого класса - C++
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Вызов динамического метода класса по указателю на объект класса - C++
Как это можно сделать? И хотелось бы как можно проще.

Вызов метода внутреннего класса методом внешнего класса - C++
Не могу разобраться как реализовать вложенный класс и как его вызвать. Занимаюсь по Лафоре, про вложенные классы ничего, а задача в конце...

Вызов метода класса без создания экземпляра класса. - C++
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов. Я это делаю с помощью new - delete. Мне...

Вызов метода базового класса из класса-потомка - C++
Нужно вызывать из метода, переопределенного в потомке, соответствующий метод базового класса. При этом они являются виртуальными. Вот...

11
Buckstabue
177 / 126 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 20:50 #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;
}
1
yoghurt92
375 / 346 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 20:55  [ТС] #3
Buckstabue, спасибо, пробовал использовать адаптеры, но без статик не работало, в почему без статик не работало?
0
Buckstabue
177 / 126 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:00 #4
yoghurt92, а фиг его знает. Формат вызова метода в C++ имеет вид "объект.имя_метода(аргументы)", а STL внутри функции for_each генерирует что-то другое, не в этом формате
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 21:01 #5
Цитата Сообщение от yoghurt92 Посмотреть сообщение
в почему без статик не работало?
потому что нельзя вызвать метод без объекта
1
yoghurt92
375 / 346 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:02  [ТС] #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));
        }
0
Buckstabue
177 / 126 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:10 #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;
}
0
yoghurt92
375 / 346 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:14  [ТС] #8
Buckstabue, а как тогда быть?
0
Buckstabue
177 / 126 / 6
Регистрация: 12.01.2012
Сообщений: 624
16.04.2013, 21:22 #9
yoghurt92, не знаю, зависит от ситуации. Либо вручную обходить коллекцию и вызывать для нее метод, либо создавать нормальный функциональный объект. Я сам в этом не очень опытен. Но в твоем коде, я не вижу безвыходной ситуации. Я считаю, не надо подстраивать свой код под STL, а использовать STL только там, где это удобно
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 21:29 #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));
        }
};
1
yoghurt92
375 / 346 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
16.04.2013, 21:57  [ТС] #11
ну я думаю тогда лучше уже просто сделать функции без класса, все работает если сделать функциями

Добавлено через 31 секунду
Jupiter, а можно объяснить 3 аргумент в for_each
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.04.2013, 22:19 #12
http://blog.think-async.com/2010/04/bind-illustrated.html
для тех у кого слабый английский - хватит и картинок
1
16.04.2013, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2013, 22:19
Привет! Вот еще темы с ответами:

Вызов метода класса - C++
main.cpp: #include &quot;Processor.h&quot; int main() { pr.show(); //здесь пишет ошибку return 0; }

Вызов метода класса из DLL - C++
Добрый вечер. Имеется длл, в которой есть: 1. Класс, содержащий метод 2. Функция, возвращающая объект этого класса Если п.2...

Вызов метода родительского класса - C++
Всем доброго вечера! Читаю Р. Лафоре. Он пишет: Т.е. исходя из этого, можно предположить, что производный класс имеет...

Вызов метода класса из main - C++
Как вызвать функцию plus в меин? пробовал вариант р3.=р3.plus(p1,p2), но не получилось #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru