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

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

Войти
Регистрация
Восстановить пароль
 
sysop999
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 64
#1

Как достать указатель на объект из контейнера set - C++

29.07.2012, 22:46. Просмотров 707. Ответов 4
Метки нет (Все метки)

Имеется вот такой код
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include "stdafx.h"
#include <string>
#include <iostream>
#include <fstream>
#include <set>
#include <conio.h>
using namespace std;
 
class Body;
 
class Folder
{
public :
    Folder () 
    {
        p_data = &data;
        cout << "Folder START" << endl;
    }
 
    void put_pointer (Body *f_pointer)
    {
        data.insert(f_pointer);
    }
    int get_size ()
    {
        return data.size();
    }
    void get_data ()
    {
        set <Body*>::iterator set_it = data.begin();
        (*set_it)->get_status();
    }
private:
    set <Body*> data;
    set <Body*> *p_data;
}; 
 
class Body
{
public :
    Body (string unit_string, Folder *folder) : all_data(unit_string)  
    {
        string::size_type pos_b;
        string::size_type pos_l;
        string::size_type pos_m;
        pos_l = all_data.size();
        s_valid = true;
 
        if ((all_data.find("<unit>") == 0) && (all_data.find("</unit>") == pos_l-7)) // unit block
            s_unit = true;
        else
        {
            s_unit = false;
            s_valid = false;
        }
 
        pos_b = all_data.find("<first_name>"); // first_name block
        pos_m = all_data.find_first_of(">",pos_b) + 1;
        pos_l = all_data.find("</first_name>");
        if (pos_b < pos_l)
            s_first_name = true;
        else
        {
            s_first_name = false;
            s_valid = false;
        }
        first_name = all_data.substr(pos_m,pos_l-pos_m);
 
                
        pos_b = all_data.find("<last_name>"); // last_name block
        pos_m = all_data.find_first_of(">",pos_b) + 1;
        pos_l = all_data.find("</last_name>");
        if (pos_b < pos_l)
            s_last_name = true;
        else
        {
            s_last_name = false;
            s_valid = false;
        }
        last_name = all_data.substr(pos_m,pos_l-pos_m);
 
        pos_b = all_data.find("<place_of_residence>"); // place_of_residence block
        pos_l = all_data.find("</place_of_residence>");
        if (pos_b < pos_l)
            s_place_of_residence = true;
        else
        {
            s_place_of_residence = false;
            s_valid = false;
        }
 
        pos_b = all_data.find("<city>"); // place_of_residence block -> city block
        pos_m = all_data.find_first_of(">",pos_b) + 1;
        pos_l = all_data.find("</city>");
        if (pos_b < pos_l)
            s_city = true;
        else
        {
            s_city = false;
            s_valid = false;
        }
        city = all_data.substr(pos_m,pos_l-pos_m);
 
        pos_b = all_data.find("<street_address>"); //  place_of_residence block -> street_address block
        pos_m = all_data.find_first_of(">",pos_b) + 1;
        pos_l = all_data.find("</street_address>");
        if (pos_b < pos_l)
            s_street_address = true;
        else
        {
            s_street_address = false;
            s_valid = false;
        }
        street_address = all_data.substr(pos_m,pos_l-pos_m);
 
        f_pointer = folder;
        put_pointer();
 
    }
    void put_pointer ()
    {
        f_pointer->put_pointer(this);
    }
    void get_status ()
    {
        cout << endl << "Object status" << endl
             << s_unit << s_first_name << s_last_name
             << s_place_of_residence << s_city << s_street_address
             << s_valid << endl;
        cout << "Unit data " << endl
             << "First name = " << first_name
             << " Last name= " << last_name
             << " City = " << city
             << " Street address = " << street_address << endl;
    }
 
private:
    // structure data
    bool s_unit;
    bool s_first_name;
    bool s_last_name;
    bool s_place_of_residence;
    bool s_city;
    bool s_street_address;
    // personal data
    string first_name;
    string last_name;
    string city;
    string street_address;
    string all_data;
    // valid unit
    bool s_valid;
    Folder *f_pointer;
}; 
 
 
int main()
{
    cout << "Please enter a file name" << endl;
    string file_name;
    cin >> file_name;
 
    ifstream infile;          // assign data file
    infile.open(file_name);
    if (!infile)              // check file
    {
        cout << "File not found" << endl;
        return -1;
    }
    string word;
    string sentences;
    while (!infile.eof())     // load file in string
    {
        infile >> word;
        sentences += word;
    }
    cout << sentences;
    cout << endl;
 
 
    
    string sentence;
    string::size_type pos_l;
    Body *m_body;
    Folder *m_folder = new Folder ();
 
    while (!sentences.empty())
    { 
        pos_l = sentences.find("</unit>");
        if (pos_l == string::npos)
        {
            sentences.clear();
            cout << "File is empty" << endl;
        }
        else
        {
        sentence = sentences.substr(0,pos_l+7);
        sentences.erase(0,pos_l+7);
        m_body = new Body (sentence,m_folder);
        }
    } 
    cout << endl; 
    cout << m_folder->get_size() ; 
    cout << endl;
    cout << sentence << endl;
 
    getch();
    return 0;
}
Вопрос в том, как с этого контейнера-интератора достать указатель на класс и вызвать функцию get_satus()
Класс Body я объявил выше, но определил ниже класса Folder
Вот в этом месте :
C++
1
2
3
4
5
6
7
8
9
    void get_data ()
    {
        set <Body*>::iterator set_it = data.begin();
        (*set_it)->get_status(); // КАК ЗДЕСЬ СДЕЛАТЬ ???????????????
    }
private:
    set <Body*> data;
    set <Body*> *p_data;
};
Пишет ошибка :
c:\users\dudi\documents\visual studio 2010\projects\p_r_d\p_r_d\p_r_d.cpp(31): error C2027: use of undefined type 'Body'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2012, 22:46     Как достать указатель на объект из контейнера set
Посмотрите здесь:

Достать нужный объект из контейнера - C++
Возник вопрос, отчасти я сам решил(получил нужный результат), но очень коряво. Мне нужно достать нужный объект из контейнера на...

Шаблон как тип контейнера std::set - C++
template&lt;class T&gt; int func(T&amp;, int); typedef std::ostream_iterator&lt;int&gt; out_in; int main() { int xx{1, 2, 3, 4, 5, 6, 7, 7,...

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

Итератор контейнера set - C++
Здравствуйте! Каким образом можно изменить значение итератора set на n (кроме вызова ++ n раз). Можно ли преобразовать итератор одного типа...

Объединить два контейнера set - C++
У меня есть два сета, их надо как то обьеденить в один сет. Как это сделать? Вот мой код, он выдает ошибку - ругается на поле с merge. ...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.07.2012, 22:47     Как достать указатель на объект из контейнера set #2
хотя это set
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
29.07.2012, 22:51     Как достать указатель на объект из контейнера set #3
Надо сделать реализацию функции после класса Body

C++
1
2
3
4
5
    void Folder::get_data ()
    {
        set <Body*>::iterator set_it = data.begin();
        (*set_it)->get_status();
    }
И
C++
1
    infile.open(file_name.c_str());
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
29.07.2012, 22:54     Как достать указатель на объект из контейнера set #4
то что вы использовали объявление
Цитата Сообщение от sysop999 Посмотреть сообщение
class Body;
говорит лишь о том, что вы можете использовать указатели на Body

Цитата Сообщение от sysop999 Посмотреть сообщение
(*set_it)->get_status();
такое действительно не пройдет
Body должен быть раньше объявлен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 22:59     Как достать указатель на объект из контейнера set
Еще ссылки по теме:

Сравнить два контейнера set - C++
Всем добрый вечер . Как сравнить два контейнера set? Допустим: set &lt;int&gt; m1; set &lt;int&gt; m2; for( int i = 0; i &lt; 5;...

Свой компаратор для контейнера set - C++
Здравствуйте! Код следующий (комменты): #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;set&gt; using namespace std; //...

Использование контейнера set для создания словаря - C++
Всем привет. Прошу помощи с программой. Само задание: Написать программу «Англо - русский и русско - английский словарь». «База данных»...

Считать из файла 2 строки с числами в 2 контейнера set - C++
Здравствуйте! Помогите, как считать из файла последовательно 2 строки с числами? Например файл такой: 56 78 4 2 2 33 1 45 Нужно...

Вывод контейнера типа set <string> в файл - C++
Конечный файл пустует, я всяко-разно пытался, вот мой вариант с итераторами. Смотрите закоментированный код - всё остальное полностью...

На базе контейнера vector из стандартной библиотеки С++ создайте шаблон класса Set, - C++
На базе контейнера vector из стандартной библиотеки С++ создайте шаблон класса Set, в котором каждый объект может храниться только в одной...


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

Или воспользуйтесь поиском по форуму:
sysop999
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 64
29.07.2012, 22:59  [ТС]     Как достать указатель на объект из контейнера set #5
Спасобо =), только учу с++,вынес функцию за тело класса все заработало =)
Yandex
Объявления
29.07.2012, 22:59     Как достать указатель на объект из контейнера set
Ответ Создать тему
Опции темы

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