Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731

Доступ к пользовательскому класу по void указателю

15.10.2016, 15:37. Показов 2667. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть указатель
C++
1
void* pointer = 0; //указатель на объект
Известно, на какой именно тип объекта ссылается указатель.

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

Мне необходимо чтобы некоторая функция возвращала указатель как указатель на Button
Как я только не пытался....
C++
1
2
3
    Button *pointer() {
        Button* but_time = Button(pointer);
        return but_time;
Далее эта функция используется чтобы прикрепить ссылку на конкретный объект.
C++
1
2
    Button* Button_time = pointer_object[pointer].pointer();
    Button_time[0].~Button;
подскажите пожалуйста каким образом можно пере присвоить ссылку с (void*) на (Button*)
Я понимаю что тут надо что-то типо конструктора делать, но как?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2016, 15:37
Ответы с готовыми решениями:

Массив по указателю void*
Как сравнивать элементы массива имея указатель void* на него, размер массива и размер в байтах одного элемента?

Указателю void присвоить значение
Добавляю в TreeView узлы для дерева и там есть такое поле, как Data. Оно имеет тип void *. Я хочу в это поле записать число, а потом с...

Преобразование указателя void к указателю на структуру
Здравствуйте! Можете объяснить эти строки в программе? int cmp(const void* p1, const void* p2) { return...

44
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
15.10.2016, 15:40
Цитата Сообщение от koker007 Посмотреть сообщение
каким образом можно пере присвоить ссылку с (void*) на (Button*)
C++
1
dynamic_cast< Button* >( pointer );
1
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 16:02  [ТС]
Цитата Сообщение от GbaLog- Посмотреть сообщение
dynamic_cast< Button* >( pointer );
C++
1
2
3
    Button *get_pointer(Button but_time) {
        but_time = dynamic_cast<Button*>(pointer);
        return &but_time;
операнд указателя dynamic_cast должен быть указателем на тип полного класса

Подчеркивает красным pointer. void не принимает?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
15.10.2016, 16:07
Лучший ответ Сообщение было отмечено koker007 как решение

Решение

Цитата Сообщение от koker007 Посмотреть сообщение
операнд указателя dynamic_cast должен быть указателем на тип полного класса
Я затупил просто, надо static_cast. И да, but_time должен быть указателем, чтобы присвоить ему указатель.
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.10.2016, 16:10
koker007, здесь нужен static_cast.

Добавлено через 2 минуты
В целом, зачем тут void * вообще?
Если у тебя тип всегда один там лежит, то проще сразу хранить Button *.
Без веских причин лучше не отказываться от контроля системы типов.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.10.2016, 16:20
Цитата Сообщение от DrOffset Посмотреть сообщение
Если у тебя тип всегда один там лежит, то проще сразу хранить Button *.
Похоже не только. Там именно указатели на void лежат. Сделать интерфейс базовый класс вроде Controll для всех и пользоваться его указателями для наследников ТС не решился. Хотя это именно тот случай, для которого наследование и создано. Видимо, это квест который надо пережить, чтобы никогда больше не возвращаться.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 16:42  [ТС]
В общем он сейчас явно принимает указатель и вроде ничего против этого не имеет, хорошо...
Но теперь пишет что:

Ошибка C2065 Button: необъявленный идентификатор 308
Ошибка C2065 Button_time: необъявленный идентификатор 308
Ошибка C2061 синтаксическая ошибка: идентификатор "Button" 308
Ошибка C2065 Button_time: необъявленный идентификатор 309


C++
1
2
                Button *Button_time = static_cast<Button*>(pointer_object[pointer].get_pointer());
                Button_time[0].~Button;
Как так?
Ведь я сам лично класс прописывал. А когда начинаю писать Bu он сам мне предлагает вставить Button. Как он может говорить что он не объявлен?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.10.2016, 16:45
Цитата Сообщение от koker007 Посмотреть сообщение
Как так?
Без кода можно сказать, что-нибудь вечное. На-вроде того, что в данном скоупе никто (компилятор) понятия не имеет ни про что перечисленное. Может заголовочник не подключили или заремили?
...или объявление слилось с предыдущей строкой (точки с запятой не хватило) или... покажите код.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
15.10.2016, 16:46
Цитата Сообщение от koker007 Посмотреть сообщение
C++
1
Button_time[0].~Button;
C++
1
Button_time[0].~Button();
Это то, что видно из приведенного кода.
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 16:51  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В целом, зачем тут void * вообще?
C++
1
2
3
4
5
6
class pointers {
private:
    void* pointer = 0; //указатель на объект
    string type = "0"; //хранит тип объекта
    string key_text = "0"; // хранит ключевое слово
}
Дело в том что тут создается массив
C++
1
pointers *pointer_object = new pointers[7000];
Массив под пользовательские объекты, все они могут быть разные, где-то под класс кнопок где-то под класс бота, ну т.д. А находятся объекты по ключевому слову, для быстродействия через хеширование.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.10.2016, 16:58
Цитата Сообщение от koker007 Посмотреть сообщение
пользовательские объекты, все они могут быть разные, где-то под класс кнопок где-то под класс бота, ну т.д.
Разделять и властвовать или смешивать и тонуть, это гамлетовский вопрос. Лучше создать несколько массивов с указателями на базовые классы. Если все объекты (кнопка и бот например) поддерживают общие методы с точки зрения функционала, то и одного достаточно. Вон GbaLog-, не зря же dynamic_cast предложил. Мозг думает о том о чём нужно (иерархии наследования в данном случае), а не о том о чем предложено. Жульничает мозг. И правильно делает.
3
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 16:59  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
покажите код
Заранее извиняюсь, просто не знаю какую именно часть показывать? тут довольно много всего написано...
Ну предположу что надо класс Button. К слову это все в одном файле прописано. Так что они вроде как должны ведь друг друга видеть?

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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
//Удаление объекта - поиск по хешу
void delete_object(string met_key_text) {
    short Deleted_yes_no = 0;
    //Расчитывается хеш-число для текстовой метки
    short pointer_obj = pointer_object[0].hashing(met_key_text);
    for (int i = 0; i < 7000 && Deleted_yes_no == 0; i++) {
 
        //Сдвигаем позицию относительно хеш-числа
        short pointer = pointer_obj + i;
        if (pointer > 7000) {
            pointer = pointer - 7000;
        }
        
        //Если метка найдена
        if (pointer_object[pointer].get_key_text() == met_key_text) {
            //Узнаем какой пользовательский тип и удаляем
            //тип кнопка
            if (pointer_object[pointer].get_type() == "Button") {
                Button *Button_time = static_cast<Button*>(pointer_object[pointer].get_pointer());
                Button_time[0].~Button;
                Deleted_yes_no = 1;
            }
        }
    }
}
 
 
class Button {
private:
    GLfloat position_x;
    GLfloat position_y;
    GLfloat position_z;
 
    GLfloat size_x;
    GLfloat size_y;
 
    static const short max_triangle = 2;
    GLuint begin_array_triangle[max_triangle];
 
    string key_word;
    short hash_num = 0;
    short position_pointer = 0;
public:
    //Конструктор по умолчанию
    Button() {
    
    }
    //конструктор кнопки
    Button(string key, GLfloat pos_x, GLfloat pos_y, GLfloat siz_x, GLfloat siz_y) {
        //заносит ключевое слово объекта
        key_word = key;
 
        position_z = -500.0f;
        position_x = pos_x;
        position_y = pos_y;
 
        size_x = siz_x;
        size_y = siz_y;
 
        //Расчет данных объекта
        //Позиционые координаты
        GLfloat position_x_1 = position_x - size_x/2;
        GLfloat position_y_1 = position_y + size_y/2;
 
        GLfloat position_x_2 = position_x + size_x/2;
        GLfloat position_y_2 = position_y + size_y/2;
 
        GLfloat position_x_3 = position_x + size_x/2;
        GLfloat position_y_3 = position_y - size_y/2;
 
        GLfloat position_x_4 = position_x - size_x/2;
        GLfloat position_y_4 = position_y - size_y/2;
 
        //текстурные координаты
        GLfloat Tex_coor_x_1 = 0.0f;
        GLfloat Tex_coor_y_1 = 1.0f;
 
        GLfloat Tex_coor_x_2 = 0.3f;
        GLfloat Tex_coor_y_2 = 1.0f;
 
        GLfloat Tex_coor_x_3 = 0.3f;
        GLfloat Tex_coor_y_3 = 0.9f;
 
        GLfloat Tex_coor_x_4 = 0.0f;
        GLfloat Tex_coor_y_4 = 0.9f;
 
        //слой
        GLfloat Tex_coor_z = 4.0f; //4
 
        //ID текстурного массива
        GLuint Tex_ID = 3; //3
 
        //Значение хеш числа
        hash_num = pointer_object[0].hashing(key_word);
        //Говорит о том занесено значение указателя в массив указателей или нет
        short ponter_yes_no = 0;
        for (short i = 0; i < 7000 && ponter_yes_no == 0; i++) {
            int pointer_num = hash_num + i;
            if (pointer_num > 7000) {
                pointer_num = pointer_num - 7000;
            }
            
            //Если ячейка свободна
            if (pointer_object[pointer_num].get_type() == "0") {
                //то записываются значения
                pointer_object[pointer_num].record_tupe_end_key("Button", key_word);
                position_pointer = pointer_num;
                ponter_yes_no = 1;
            }
        }
 
 
        //цикл пока каждый примитив не будет занесен в массив
        for (int triang = 0; triang < max_triangle; triang++) {
 
            //Занесены ли данные треугольника в массив
            short triangle_bild_yes_no = 0;
            //Поиск разрывов
            for (int i = 0; i < 3000 && triangle_bild_yes_no == 0; i++) {
                //Если найден разрыв
                if (gap_triangle_GUI[i].gap_get_size() == 1) {
                    //Занесение номера треугольника в массиве для последуюшего обращения к нему
                    begin_array_triangle[triang] = gap_triangle_GUI[i].gap_get_num();
                    //Первый примитив
                    if (triang == 0) {
                        ////////////////////////////////////////////////////
                        //Занесение данных в массивы
                        ////////////////////////////////////////////////////
                        //Заполнение данными координат треугольник 1
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 0] = position_x_1;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 1] = position_y_1;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 2] = position_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 3] = position_x_2;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 4] = position_y_2;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 5] = position_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 6] = position_x_3;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 7] = position_y_3;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 8] = position_z;
 
                        //Заполнение данными текстурных координат треугольник 1
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 0] = Tex_coor_x_1;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 1] = Tex_coor_y_1;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 2] = Tex_coor_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 3] = Tex_coor_x_2;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 4] = Tex_coor_y_2;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 5] = Tex_coor_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 6] = Tex_coor_x_3;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 7] = Tex_coor_y_3;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 8] = Tex_coor_z;
 
                        //Заполнение массива текстурного ID треугольник 1
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 0] = Tex_ID;
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 1] = Tex_ID;
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 2] = Tex_ID;
                    }
                    //Второй примитив
                    if (triang == 1) {
                        //Заполнение данными координат треугольник 2
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 0] = position_x_3;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 1] = position_y_3;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 2] = position_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 3] = position_x_4;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 4] = position_y_4;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 5] = position_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 6] = position_x_1;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 7] = position_y_1;
                        Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 8] = position_z;
 
                        //Заполнение данными текстурных координат треугольник 2
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 0] = Tex_coor_x_3;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 1] = Tex_coor_y_3;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 2] = Tex_coor_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 3] = Tex_coor_x_4;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 4] = Tex_coor_y_4;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 5] = Tex_coor_z;
 
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 6] = Tex_coor_x_1;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 7] = Tex_coor_y_1;
                        Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 8] = Tex_coor_z;
 
                        //Заполнение массива текстурного ID треугольник 2
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 0] = Tex_ID;
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 1] = Tex_ID;
                        Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 2] = Tex_ID;
                    }
                    //Удаление информации о разрыве
                    gap_triangle_GUI[i].set_to_zero();
                    triangle_bild_yes_no = 1;
                }
            }
            //Если разрывов не было и данные не занесены то данные прибавляются в конец
            if (triangle_bild_yes_no == 0) {
                begin_array_triangle[triang] = Triangle_GUI.get_amount_triangle();
                //Первый примитив
                if (triang == 0) {
                    //Заполнение данными координат треугольник 1
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 0] = position_x_1;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 1] = position_y_1;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 2] = position_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 3] = position_x_2;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 4] = position_y_2;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 5] = position_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 6] = position_x_3;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 7] = position_y_3;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 8] = position_z;
 
                    //Заполнение данными текстурных координат треугольник 1
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 0] = Tex_coor_x_1;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 1] = Tex_coor_y_1;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 2] = Tex_coor_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 3] = Tex_coor_x_2;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 4] = Tex_coor_y_2;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 5] = Tex_coor_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 6] = Tex_coor_x_3;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 7] = Tex_coor_y_3;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 8] = Tex_coor_z;
 
                    //Заполнение массива текстурного ID треугольник 1
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 0] = Tex_ID;
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 1] = Tex_ID;
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 2] = Tex_ID;
                    Triangle_GUI.Plus_amount_triangle(1);
                }
                //Второй примитив
                if (triang == 1) {
                    //Заполнение данными координат треугольник 2
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 0] = position_x_3;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 1] = position_y_3;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 2] = position_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 3] = position_x_4;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 4] = position_y_4;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 5] = position_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 6] = position_x_1;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 7] = position_y_1;
                    Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang] * 9 + 8] = position_z;
 
                    //Заполнение данными текстурных координат треугольник 2
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 0] = Tex_coor_x_3;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 1] = Tex_coor_y_3;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 2] = Tex_coor_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 3] = Tex_coor_x_4;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 4] = Tex_coor_y_4;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 5] = Tex_coor_z;
 
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 6] = Tex_coor_x_1;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 7] = Tex_coor_y_1;
                    Triangle_GUI.Vertex_Mass_triangle_TexCOR[begin_array_triangle[triang] * 9 + 8] = Tex_coor_z;
 
                    //Заполнение массива текстурного ID треугольник 2
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 0] = Tex_ID;
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 1] = Tex_ID;
                    Triangle_GUI.Vertex_Mass_triangle_TexID[begin_array_triangle[triang] * 3 + 2] = Tex_ID;
                    Triangle_GUI.Plus_amount_triangle(1);
                }
 
            }
        }
    }
    ~Button() {
        //Очистить указатель
        pointer_object[position_pointer].clear();
        for (GLuint triang = max_triangle; triang > 0; triang--)
        {
            if (begin_array_triangle[triang - 1] == (Triangle_GUI.get_amount_triangle() - 1)) {
                //Обнуление данных в массиве не обязательно
 
                //Понижение общего количества треугольников на 1
                Triangle_GUI.Minus_amount_triangle(1);
            }
            else {
                short gap_yes_no = 0;
                for (int i = 0; i < 3000 && gap_yes_no == 0; i++) {
                    if (gap_triangle_GUI[i].gap_get_size() == 0) {
                        gap_triangle_GUI[i].record(begin_array_triangle[triang-1], 1);
                        //Обнуление данных в массиве
                        for (int coord = 0; coord < 9; coord++) {
                            Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang-1] * 9 + coord] = 0;
                        }
                        for (int TEX_cor = 0; TEX_cor < 9; TEX_cor++) {
                            Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang-1] * 9 + TEX_cor] = 0;
                        }
                        for (int TEX_ID = 0; TEX_ID < 3; TEX_ID++) {
                            Triangle_GUI.Vertex_Mass_triangle_coord[begin_array_triangle[triang-1] * 9 + TEX_ID] = 0;
                        }
                        gap_yes_no = 1;
                    }
                }
            }
        }
    }
 
    //возвращяет номер для массива указателей
    short Get_num_pointer() {
        return position_pointer;
    }
};
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.10.2016, 17:07
Цитата Сообщение от koker007 Посмотреть сообщение
Так что они вроде как должны ведь друг друга видеть?
Если в одном файле, то должны.
Место вызова побольше (до того места где компилируется если заремить) и полную тираду от компилятора бы ещё.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
...или объявление слилось с предыдущей строкой (точки с запятой не хватило) или... покажите код.
или в ветви if или case объявили. То есть скоуп объявления и вызова сюда надо бы.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
15.10.2016, 17:08
Цитата Сообщение от koker007 Посмотреть сообщение
К слову это все в одном файле прописано.
Но не в том порядке. Класс выше должен быть.
2
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.10.2016, 17:21
Или написать свой класс Variant/Any или использовать из Boost или др библиотек.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.10.2016, 17:40
Цитата Сообщение от koker007 Посмотреть сообщение
C++
1
2
Button *Button_time = static_cast<Button*>(pointer_object[pointer].get_pointer()); 
Button_time[0].~Button;
Жуть какая
Объект кнопки ведь изначально через new создавался?
Тогда почему нет delete?
Сейчас тут память у тебя течет; и деструктор явно вызывать надо только в достаточно специфических случаях, да и у деструктора скобки потерял

Добавлено через 8 минут
Цитата Сообщение от koker007 Посмотреть сообщение
все они могут быть разные, где-то под класс кнопок где-то под класс бота, ну т.д.
Прислушайся:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сделать базовый класс вроде Controll для всех и пользоваться его указателями
Добавлено через 7 минут
koker007,
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <vector>
#include <memory>
 
class Object
{
public:
    virtual ~Object() {}
    
    virtual char const * typeName() const = 0;
};
 
class Button 
    : public Object
{
public:
    char const * typeName() const
    {
        return "Button";
    }
};
 
class Bot 
    : public Object
{
public:
    char const * typeName() const
    {
        return "Bot";
    }
};
 
int main()
{
    std::vector<std::unique_ptr<Object>> objects(10);
    
    objects[0] = std::make_unique<Button>();
    objects[1] = std::make_unique<Bot>();
    
    
    for(auto & r : objects)
    {
        if(r)
        {
            std::cout << r->typeName() << std::endl;
        }
    }
}
http://rextester.com/EPRMS26406
3
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 17:41  [ТС]
Цитата Сообщение от nd2 Посмотреть сообщение
Но не в том порядке.
От перестановки слагае.... Короче ничего не изменилось =)

В общем все выполняется в таком порядке

Из класса меню вызывается удаление:

C++
1
2
3
4
5
6
7
8
9
    string Create_new_game_button_pkey = "New_Table";
 
    //Удаление элемента создания игры
    void Delete_new_game_element() {
        delete_object(Create_new_game_button_pkey);
        if (create_game_open == 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
//Удаление объекта - поиск по хешу
void delete_object(string met_key_text) {
    short Deleted_yes_no = 0;
    //Расчитывается хеш-число для текстовой метки
    short pointer_obj = pointer_object[0].hashing(met_key_text);
    for (int i = 0; i < 7000 && Deleted_yes_no == 0; i++) {
 
        //Сдвигаем позицию относительно хеш-числа
        short pointer = pointer_obj + i;
        if (pointer > 7000) {
            pointer = pointer - 7000;
        }
 
        //Если метка найдена
        if (pointer_object[pointer].get_key_text() == met_key_text) {
            //Узнаем какой пользовательский тип удаляем
            //кнопка
            if (pointer_object[pointer].get_type() == "Button") {
                Button *Button_time = static_cast<Button*>(pointer_object[pointer].get_pointer());
                Button_time[0].~Button;
                Deleted_yes_no = 1;
            }
        }
    }
}
Там первым делом вызывается функция hashing() которая принимает ключевую фразу и возращает некоторое число.
Число это, это точка начала отсчета, для того чтобы можно было узнать местонахождение указателя искомого объекта.
Когда там ключевое слово совпадает с ключевым словом у указателя, это значит, указатель именно тот который ищется.

C++
1
2
3
4
5
6
    void* pointer = 0; //указатель на объект
 
    //Возвращяет указатель
    void *get_pointer() {
        return pointer;
    }
Далее через функцию get_pointer() передается void указатель который после возвращения должен трансформироваться в указатель на класс button. Но компилятор вдруг забыл что это такое.

Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть скоуп объявления и вызова сюда надо бы.
И к слову, я не понял. Можно пропроще, без жаргона и термиров, а то так еще сильнее затеряюсь

Цитата Сообщение от DrOffset Посмотреть сообщение
Тогда почему нет delete?
Переделал
C++
1
2
                Button *Button_time = static_cast<Button*>(pointer_object[pointer].get_pointer());
                delete Button_time;
Был уверен что если вызывается деструктор то он понимает что память нужно освободить, а оно вот как оказывается, что только через delete.


Ошибки остаются.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.10.2016, 17:54
Цитата Сообщение от koker007 Посмотреть сообщение
Был уверен что если вызывается деструктор то он понимает что память нужно освободить
Деструктор может освободить память для членов класса, но память под сам объект класса он не освобождает.
Хоть я и не из тех, кто считает, что для программирования на С++ нужно обязательно знать С, но здесь напрашивается пример, который знаком любому сишнику, и соответственно, суть констукторов и деструкторов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// выражение new = выделение памяти + инициализация
// выражение delete = деинициализация + освобождение памяти
 
void * p = malloc(sizeof(MyClass)); // operator new(sizeof(MyClass))
MyClass * obj = MyClassConstructor(p); // Constructor MyClass();
//^^--- MyClass * obj = new myClass();
 
 
// работа с obj
 
MyClassDestructor(obj); // Destructor ~MyClass();
free(obj); // operator delete(obj);
//^^--- delete obj;
Т.е. new - это вызов функции аллокации (operator new) памяти + вызов функции инициализации этой памяти - что создает из куска памяти объект в высокоуровневом смысле. А delete, соответственно, вызов функции деинициализации памяти - уничтожение объекта, и затем вызов функции деаллокации (operator delete) - освобождения памяти.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.10.2016, 18:05
Цитата Сообщение от DrOffset Посмотреть сообщение
может освободить память для членов класса
запуская все delete и free если они прописаны, а так же деструкторы вложенных объектов которые запускают...
0
 Аватар для koker007
59 / 52 / 11
Регистрация: 04.08.2015
Сообщений: 731
15.10.2016, 18:06  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Прислушайся:
Сообщение от IGPIGP
Сделать базовый класс вроде Controll для всех и пользоваться его указателями
Спасибо, за верное направление, если тут решения так и не найдется, завтра буду все переделывать.
Авось проблема и решится сама собой.
Отпишусь как будет готово
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.10.2016, 18:06
Помогаю со студенческими работами здесь

Привести указатель на класс к указателю на void
Хай #pragma once #include &quot;list.h&quot;; #include &quot;Print.h&quot;; class Robot { public:

Как привести тип умного указателя к указателю на void?
Изучаем WinAPI, необходимо выполнить задание: Написать программу, которая в одном потоке сохраняет в векторе структуры PROCESSENTRY32,...

Описать функцию типа void с передачей параметров по ссылке или указателю POWERA234(A,B,C,D), вычисляющую вторую, третью
Описать функцию типа void с передачей параметров по ссылке или указателю POWERA234(A,B,C,D), вычисляющую вторую, третью и четвертую...

Доступ к указателю - элементу класса
Есть класс. В нем есть элемент-указатель (на голову списка). Можно ли получить как то этот указатель через объект класса, кроме как через...

Доступ к элементам CStringArray по указателю
Здравствуйте всем! Visual C++ 6, MFC. Проблемка такая: в функции создаю массив и заполняю, при выходе отдаю ссылку на массив. В основной...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru