Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 64
1

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

29.07.2012, 22:46. Просмотров 1254. Ответов 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'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2012, 22:46
Ответы с готовыми решениями:

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

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать?
Подскажите, что значит константный указатель на объект, указатель на константный объект, и как это...

Шаблон как тип контейнера std::set
template&lt;class T&gt; int func(T&amp;, int); typedef std::ostream_iterator&lt;int&gt; out_in; int main() { ...

Как вывести элементы контейнера set с ключами собственного типа?
Есть класс, который является типом ключа set. Класс и предикат к нему #include &lt;string&gt; using...

4
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.07.2012, 22:47 2
хотя это set
0
Фрилансер
Эксперт С++
5842 / 1223 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 1
29.07.2012, 22:51 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());
1
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
29.07.2012, 22:54 4
то что вы использовали объявление
Цитата Сообщение от sysop999 Посмотреть сообщение
class Body;
говорит лишь о том, что вы можете использовать указатели на Body

Цитата Сообщение от sysop999 Посмотреть сообщение
(*set_it)->get_status();
такое действительно не пройдет
Body должен быть раньше объявлен
1
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 64
29.07.2012, 22:59  [ТС] 5
Спасобо =), только учу с++,вынес функцию за тело класса все заработало =)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2012, 22:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как преобразовать ссылку на объект в указатель на этот объект?
Как преобразовать ссылку на объект в указатель на этот объект? Буду благодарен за помощь.

Если объект добавлять в 2 контейнера, то в них будет ссылка или новый объект?
Есть объект - obj. Последовательно добавляю его в два контейнера container1.add(obj);...

Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект
Други мои , кодеры. Не могу я ни как передать в функцию объект класса , или что еще лучше(для меня...

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


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

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

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