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

Поле класса теряет информацию - C++

Восстановить пароль Регистрация
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
25.02.2012, 20:10     Поле класса теряет информацию #1
Есть класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class anagramma{
    map<string, list<string> > data;
public:
    void operator ()(string d)
    {
        if(data.begin() == data.end())
            cout<<" ТВОЮ МАТЬ"; 
        string s = d;
        sort(s.begin(), s.end());
        data[s].push_back(d);
    }
 
public: void print()
    {
        if(data.begin() == data.end())
            cout<<" ТВОЮ МАТЬ";
    }
};
есть файл и, соответственно, поток. Сам мейн.
C++
1
2
3
4
5
6
7
8
9
10
11
12
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    ifstream FS;
    FS.open("05.txt");
    
    anagramma ana;
    for_each(istream_iterator<string>(FS), istream_iterator<string>(), ana);
    ana.print();
    FS.close();
    return 0;
}
фраза "ТВОЮ МАТЬ" выводится 2 раза: первый раз при первой иттерации лямбда-функции.
второй раз, когда я пытаюсь сделать "ana.print()". Почему после завершения работы лямбды-функции поле ana.data теряет информацию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2012, 20:10     Поле класса теряет информацию
Посмотрите здесь:

Класс как поле класса C++
Построить описание класса, содержащего информацию о почтовом адресе организации C++
Построить описание класса, содержащего информацию об учащемся колледжа C++
Построить описание класса, содержащего информацию о почтовом адресе организации C++
C++ Статическое поле класса, имеющее тип того же класса
Изменить поле класса C++
Структуры. Ввести и записать в файл информацию о расписании занятий 11 класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
25.02.2012, 20:24     Поле класса теряет информацию #2
потому что ваш объект ana не изменяется. в for_each передается копия функтора
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
25.02.2012, 20:24     Поле класса теряет информацию #3
Это потому, что функция for_each принимает третий параметр по значению.
C++
1
2
template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function f);
Соответственно, при её вызове создается копия объекта класса, над которым и проводится манипуляция.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
25.02.2012, 20:28  [ТС]     Поле класса теряет информацию #4
ок...а можно ли как-то "принудительно" передать по ссылке для for_each
или придётся создать "обёртку", которая будет принимать ana по ссылке?
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.02.2012, 20:33     Поле класса теряет информацию #5
Цитата Сообщение от IcyWind Посмотреть сообщение
ок...а можно ли как-то "принудительно" передать по ссылке для for_each
или придётся создать "обёртку", которая будет принимать ana по ссылке?
Можно так попробовать.
C++
1
for_each(istream_iterator<string>(FS), istream_iterator<string>(), ref(ana) );
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
25.02.2012, 20:44     Поле класса теряет информацию #6
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
34
35
36
37
class anagramma
{
    map<string, list<string> > data;
 
public:
    void
    add(const string& d)
    {
        if(data.begin() == data.end())
            cout << " ТВОЮ МАТЬ";
        string s(d);
        sort(s.begin(), s.end());
        data[s].push_back(d);
    }
 
    void
    print()
    {
        if(data.begin() == data.end())
            cout << " ТВОЮ МАТЬ";
    }
};
 
class func
{
    anagramma& ana_;
public:
    func(anagramma& a) : ana_(a) { }
 
    void
    operator()(const string& d)
    {
        ana_.add(d);
    }
};
...
for_each(istream_iterator<string>(FS), istream_iterator<string>(), func(ana));
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
25.02.2012, 21:57  [ТС]     Поле класса теряет информацию #7
Цитата Сообщение от diagon Посмотреть сообщение
Можно так попробовать.
C++
1
for_each(istream_iterator<string>(FS), istream_iterator<string>(), ref(ana) );
ref? Это что?

Добавлено через 29 минут
Спс, использовал "обёртку-класс"
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.02.2012, 07:54     Поле класса теряет информацию #8
Цитата Сообщение от IcyWind Посмотреть сообщение
ref? Это что?
Для нее нужен компилятор, поддерживающий c++11(т.е. gcc).
http://en.cppreference.com/w/cpp/utility/functional/ref
Вроде как работает - пруф.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
26.02.2012, 17:50  [ТС]     Поле класса теряет информацию #9
Хм для любопытства.. c++11 это просто переименованный c++10?)
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.02.2012, 18:28     Поле класса теряет информацию #10
Цитата Сообщение от IcyWind Посмотреть сообщение
Хм для любопытства.. c++11 это просто переименованный c++10?)
Не с++10, а с++0x.
Avazart
Нарушитель
6954 / 5192 / 256
Регистрация: 10.12.2010
Сообщений: 22,769
Записей в блоге: 17
26.02.2012, 18:52     Поле класса теряет информацию #11
а так не проканает?
C++
1
static map<string, list<string> > data;
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.02.2012, 18:54     Поле класса теряет информацию #12
diagon, и даже не c++0x, а теперь уже c++1x))
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.02.2012, 18:59     Поле класса теряет информацию #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
diagon, и даже не c++0x, а теперь уже c++1x))
Эм... В смысле?
C++11 или ISO/IEC 14882:2011 (в процессе работы над стандартом носил условное наименование C++0x)
(с) википедия
retmas
Жарю без масла
831 / 713 / 156
Регистрация: 13.01.2012
Сообщений: 1,637
26.02.2012, 19:02     Поле класса теряет информацию #14
diagon, просто silent_1991 хотел сказать, что работа над след стандартом С++1х идет полным ходом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 14:34     Поле класса теряет информацию
Еще ссылки по теме:

Вектор, как поле класса C++
C++ Построить описание класса, содержащего информацию об оргтехнике
C++ Указатель на поле класса
Breakpoint: при попытке вывести элементы класса указатель теряет начальное значение C++
C++ Поле класса const; ?

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

Или воспользуйтесь поиском по форуму:
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
28.02.2012, 14:34  [ТС]     Поле класса теряет информацию #15
Кстати, нашёл лучший вариант.
for_each возвращает как раз-тики объект, который мне нужен. Поэтому, выход - это
C++
1
ana = for_each(...,ana);
Добавлено через 4 минуты
А ещё лучше так
C++
1
anagramma ana = for_each(istream_iterator<string>(FS), istream_iterator<string>(), anagramma());
Yandex
Объявления
28.02.2012, 14:34     Поле класса теряет информацию
Ответ Создать тему
Опции темы

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