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

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

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

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

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

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

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! - C++
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; float x,y; POINT2D ...

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

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ ...

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

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

14
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
25.02.2012, 20:24 #2
потому что ваш объект ana не изменяется. в for_each передается копия функтора
0
lemegeton
2928 / 1357 / 136
Регистрация: 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);
Соответственно, при её вызове создается копия объекта класса, над которым и проводится манипуляция.
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
25.02.2012, 20:28  [ТС] #4
ок...а можно ли как-то "принудительно" передать по ссылке для for_each
или придётся создать "обёртку", которая будет принимать ana по ссылке?
0
diagon
Higher
1933 / 1199 / 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) );
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
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));
1
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
25.02.2012, 21:57  [ТС] #7
Цитата Сообщение от diagon Посмотреть сообщение
Можно так попробовать.
C++
1
for_each(istream_iterator<string>(FS), istream_iterator<string>(), ref(ana) );
ref? Это что?

Добавлено через 29 минут
Спс, использовал "обёртку-класс"
0
diagon
Higher
1933 / 1199 / 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
Вроде как работает - пруф.
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
26.02.2012, 17:50  [ТС] #9
Хм для любопытства.. c++11 это просто переименованный c++10?)
0
diagon
Higher
1933 / 1199 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
26.02.2012, 18:28 #10
Цитата Сообщение от IcyWind Посмотреть сообщение
Хм для любопытства.. c++11 это просто переименованный c++10?)
Не с++10, а с++0x.
0
Avazart
Эксперт С++
7459 / 5505 / 315
Регистрация: 10.12.2010
Сообщений: 24,559
Записей в блоге: 17
26.02.2012, 18:52 #11
а так не проканает?
C++
1
static map<string, list<string> > data;
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
26.02.2012, 18:54 #12
diagon, и даже не c++0x, а теперь уже c++1x))
0
diagon
Higher
1933 / 1199 / 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)
(с) википедия
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
26.02.2012, 19:02 #14
diagon, просто silent_1991 хотел сказать, что работа над след стандартом С++1х идет полным ходом
2
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
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());
1
28.02.2012, 14:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2012, 14:34
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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