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

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

Восстановить пароль Регистрация
 
sysop999
0 / 0 / 0
Регистрация: 07.04.2012
Сообщений: 64
29.07.2012, 22:46     Как достать указатель на объект из контейнера set #1
Имеется вот такой код
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'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.07.2012, 22:47     Как достать указатель на объект из контейнера set #2
хотя это set
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.07.2012, 22:54     Как достать указатель на объект из контейнера set #4
то что вы использовали объявление
Цитата Сообщение от sysop999 Посмотреть сообщение
class Body;
говорит лишь о том, что вы можете использовать указатели на Body

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

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