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

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

Войти
Регистрация
Восстановить пароль
 
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 269
#1

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

25.02.2012, 20:10. Просмотров 777. Ответов 14
Метки нет (Все метки)

Есть класс
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     Поле класса теряет информацию
Посмотрите здесь:

Breakpoint: при попытке вывести элементы класса указатель теряет начальное значение - C++
При попытке вывести элементы класса указатель теряет начальное значение. template&lt;typename T&gt; void Graph&lt;T&gt;::print() { ...

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

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

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

Указатель на поле класса - C++
Доброго дня суток. Есть класс DataOfGroup, список экземпляров этого класса lst, begin() - итератор, установленный на начало списка lst,...

Изменить поле класса - C++
код большой и использует доп. библиотеки - постараюсь описать схематично(надеюсь будет понятно) есть класс А, есть класс B : А...

Поле класса const; ? - C++
Встретил следующий код в книге &quot;С++. Стандартная библиотека. Николай Джосьютис&quot; (привожу только интересующую его часть): class Person ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
25.02.2012, 20:24     Поле класса теряет информацию #2
потому что ваш объект ana не изменяется. в for_each передается копия функтора
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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
Сообщений: 269
25.02.2012, 20:28  [ТС]     Поле класса теряет информацию #4
ок...а можно ли как-то "принудительно" передать по ссылке для for_each
или придётся создать "обёртку", которая будет принимать ana по ссылке?
diagon
Higher
1928 / 1194 / 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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
Сообщений: 269
25.02.2012, 21:57  [ТС]     Поле класса теряет информацию #7
Цитата Сообщение от diagon Посмотреть сообщение
Можно так попробовать.
C++
1
for_each(istream_iterator<string>(FS), istream_iterator<string>(), ref(ana) );
ref? Это что?

Добавлено через 29 минут
Спс, использовал "обёртку-класс"
diagon
Higher
1928 / 1194 / 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
Сообщений: 269
26.02.2012, 17:50  [ТС]     Поле класса теряет информацию #9
Хм для любопытства.. c++11 это просто переименованный c++10?)
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.02.2012, 18:28     Поле класса теряет информацию #10
Цитата Сообщение от IcyWind Посмотреть сообщение
Хм для любопытства.. c++11 это просто переименованный c++10?)
Не с++10, а с++0x.
Avazart
Эксперт С++
7119 / 5296 / 273
Регистрация: 10.12.2010
Сообщений: 23,426
Записей в блоге: 17
26.02.2012, 18:52     Поле класса теряет информацию #11
а так не проканает?
C++
1
static map<string, list<string> > data;
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
26.02.2012, 18:54     Поле класса теряет информацию #12
diagon, и даже не c++0x, а теперь уже c++1x))
diagon
Higher
1928 / 1194 / 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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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++
помогите=) Построить описание класса, содержащего информацию о почтовом адресе организации. предусмотреть возможность раздельного...

Структуры. Ввести и записать в файл информацию о расписании занятий 11 класса - C++
ввести и записать в файл информацию о расписании занятий 11 класса (любые предметы). кто может дать алгоритм для написания этой программы?

Где храниться поле класса? - C++
Имеется класс: class Foo { Man Man; Monstr * Monstr; } В куче или стэке храниться элемент Man и Monstr для двух вариантов? ...

Класс как поле класса - C++
Нужно поместить класс внутри класса. Примерно так #include &lt;iostream.h&gt; #include &lt;conio.h&gt; // program.hpp class TPoint { ...


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

Или воспользуйтесь поиском по форуму:
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 269
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     Поле класса теряет информацию
Ответ Создать тему
Опции темы

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