Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
1

Специализация операции шаблона

29.11.2013, 15:38. Показов 1676. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

Имеется шаблон:

C++
1
2
3
4
5
6
7
template<class Type>class Figures
{
    /*...*/
    public:
        /*...*/
        void save();
};
Пытаюсь специализировать функцию save() для типа Square*

C++
1
2
3
4
5
6
7
8
9
void Figures<Square*>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","a");
    /*вывод в файл*/
    fclose(fout);
}
Но получаю ошибку "Ошибка 16 error C2065: FILE: необъявленный идентификатор"
Stdio.h подключен.

Может я не правильно специализирую? Т.к. я не описываю template<class Type>void Figures<Type>::save(), а только специализированный для Square*.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2013, 15:38
Ответы с готовыми решениями:

Специализация шаблона
Всем доброго вечера! Возникает непонятная ошибка при создании специализации родового класса cl. В...

специализация шаблона
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по...

Специализация шаблона
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ ...

Специализация шаблона
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве...

30
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
29.11.2013, 15:50 2
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 16:18  [ТС] 3
Цитата Сообщение от ForEveR Посмотреть сообщение
Quadra, Специализации шаблона... Классы... FILE*? WAT? Чем fstream то не нравится?
ЗЫ файл называется stdio.h, не говоря уже о том что в С++ стоит юзать cstdio
Файл так и назван, привычка писать заглавную букву.

Возможно я не так выразился, у меня есть шаблон контейнера, который должен подстраиваться под 3 типа данных, Square один из них. В зависимости от этих типов меняется и тип самого контейнера, а в файл выводятся немного разные данные. Мне нужно переопределить шаблон под эти три заданные типа.

Также мне интересно, почему в такой реализации тип FILE не воспринимается шаблоном.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:45 4
Среда какая?
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 16:50  [ТС] 5
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая?
VS08
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 16:54 6
Сделан #include <cstdio> и всё равно ошибка?
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 16:55  [ТС] 7
Цитата Сообщение от alsav22 Посмотреть сообщение
Сделан #include <cstdio> и всё равно ошибка?
Так точно.

Если функцию описываю так

C++
1
2
3
4
5
6
7
8
template <class Type>void Figures<Type>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","w");
    /*вывод в файл*/
    fclose(fout);
То все компилится. Проблема где-то в переопределении.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:01 8
...
Миниатюры
Специализация операции шаблона  
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
29.11.2013, 17:01 9
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:05 10
Цитата Сообщение от Quadra Посмотреть сообщение
Если функцию описываю так
Цитата Сообщение от Quadra Посмотреть сообщение
То все компилится. Проблема где-то в переопределении.
При чём здесь тогда FILE ?
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 17:07  [ТС] 11
Цитата Сообщение от alsav22 Посмотреть сообщение
...
...

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
template <>
void Figures<Square*>::save()
{
    //...
}
Пробовал, не проходит. То же самое.
Миниатюры
Специализация операции шаблона   Специализация операции шаблона  
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 17:08  [ТС] 12
del
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
29.11.2013, 17:11 13
Цитата Сообщение от Quadra Посмотреть сообщение
Пробовал, не проходит. То же самое.
код давайте нормальный, полный, а не куски, потому что куски компилятся.
А еще лучше минимизируйте код так, чтобы была только таже самая проблема
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:15 14
Quadra, инклудов на скринах не видно.
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 17:19  [ТС] 15
Цитата Сообщение от Croessmah Посмотреть сообщение
код давайте нормальный, полный, а не куски, потому что куски компилятся
Окей.

Кликните здесь для просмотра всего текста

Classes.h
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
#ifndef Classes_H
#define Classes_H
#include <windows.h>
#include <windowsx.h>
 
struct point{int x;int y;};
 
template<class Type>class Figures;
 
class Shape                                     //Фигура.
{
    protected:
        point A,B,A1,B1;
        void checkscreen(point B, RECT rt);     //Фигура умещается в окно?
        void checksquare(point A, point B);     //Фигура - квадрат?
        void checkin();                         //Второй квадрат внутри первого?
    public:
        int type;
        void clearscreen(HWND hwnd, HDC hdc);   //Очистка экрана.
 
        virtual void set_Coord()=0;             //Ввод координат.
        virtual void get_Coord()=0;             //Вывод координат на экран.
        virtual void load_Coord()=0;            //Загрузка координат из файла.
        virtual void save_Coord()=0;            //Сохранение кординат в файл.
 
        virtual void set_Sett()=0;              //Ввод настроек пера и кисти.
        virtual void get_Sett()=0;              //Вывод настроек пера и кисти на экран.
        virtual void load_Sett()=0;             //Загрузка настроек пера и кисти из файла.
        virtual void save_Sett()=0;             //Сохранение настроек пера и кисти в файл.
 
        virtual void shift(int a, int delta)=0; //Сдвиг фигуры.
 
        virtual void DRAW(HWND hwnd,HDC hdc)=0; //Функция рисования.
 
    template <class> friend class Figures;
};
 
struct color{int Red;int Green;int Blue;};
 
class Square:public Shape                       //Квадрат.
{
    protected:
        HPEN OldPen,UserPen;
        char PenStyle[12];
        int Pensize;
        color PenColor;
    public:
        void set_Coord();
        void get_Coord();
        void load_Coord();
        void save_Coord();
 
        void set_Sett();
        void get_Sett();
        void load_Sett();
        void save_Sett();
 
        void shift(int a, int delta);
 
        void DRAW(HWND hwnd,HDC hdc);
 
    template <class> friend class Figures;
};
 
class Filled                                    //Закрашенная фигура.
{
    protected:
        HBRUSH OldBrush,UserBrush,BlackBrush;
        char BrushStyle[12];
        color BrushColor;
 
};
 
class FilledSquare:public Square,public Filled  //Закрашенный квадрат.
{
    public:
        void set_Sett();
        void get_Sett();
        void load_Sett();
        void save_Sett();
 
        void DRAW(HWND hwnd,HDC hdc);
 
    template <class> friend class Figures;
};
 
class CombiSquare:public FilledSquare           //Квадрат в квадрате.
{
    protected:
        FilledSquare FS;
    public:
        void set_Coord();
        void get_Coord();
        void load_Coord();
        void save_Coord();
 
        void shift(int a, int delta);
 
        void DRAW(HWND hwnd, HDC hdc);
 
    template <class> friend class Figures;
};
 
template<class Type>class Figures
{
    private:
        int place;                                                              //Последняя свободная позиция таблицы.
        int size;                                                               //Размер таблицы.
        struct elem{Type data;int ID;} *M;
    public:
        Figures(int N);
        ~Figures();
        int get_size();
        int get_place();
        int search(int key, int *j);
        int add(Type elem, int ID);
        Type get(int i);
        int del(int key);
        void save();
};
 
template<class Type>Figures<Type>::Figures(int N){size=N;M=new elem[size];place=0;}
template<class Type>Figures<Type>::~Figures() {delete []M;}
template<class Type>int Figures<Type>::get_size() {return size;}
template<class Type>int Figures<Type>::get_place() {return place;}
template<class Type>int Figures<Type>::search(int key, int *j) 
{
    int i,R=0;
 
    for (i=0;((i<place)&&(R==0));i++)
        if (M[i].ID==key) R=1;
    i--;
    *j=i;
 
    return R;
}
template<class Type>int Figures<Type>::add(const Type elem, int ID) 
{
    int t;
 
    if (search(ID,&t)==0)
    {
        if (place<size)
        {
            M[place].data=elem;
            M[place].ID=ID;
            place++;
            return 1;
        }
        else return 0;
    }
    else return 0;
}
template<class Type>Type Figures<Type>::get(int i) 
{
    return M[i].data;
}
template<class Type>int Figures<Type>::del(int key)
{
    int i;
 
    if (search(key,&i)==1)
    {
        for (;i<place-1;i++) M[i]=M[i+1];
        place--;
        return 1;
    }
    else return 0;  
}
void Figures<Square>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","w");
    for (i=0;i<place;i++)
    {
        fprintf(fout,"ID фигуры: %d\n",M[i].ID);
        fprintf(fout,"Координаты: %d %d %d %d\n",M[i].data.A,M[i].data.B);
        fprintf(fout,"Стиль пера: %s Размер: %d Цвет: RGB(%d,%d,%d)\n",M[i].data.PenStyle,M[i].data.Pensize,M[i].data.PenColor.Red,M[i].data.PenColor.Green,M[i].data.PenColor.Blue);
        fprintf(fout,"\n\n\n");
    }
    fclose(fout);
}
 
void commandlist(int a);                        //Списки команд.
 
#endif
Main.cpp
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
#include <windows.h>  
#include <windowsx.h>  
#include <conio.h>
#include <cstdio>
#include <math.h>
#include <locale.h>
#include "Classes.h"
 
void main()
{
    setlocale(LC_CTYPE,"Russian");
    HWND hwnd=GetConsoleWindow();
    HDC hdc=GetDC(hwnd);
    int COMMAND=-1,delta,key,pos,numb;
    Shape *pS;
    Square S;
    FilledSquare FS;
    CombiSquare CS;
    FILE *FOUT;
 
    FOUT=fopen("Squares.txt","w");
    fclose(FOUT);
    FOUT=fopen("FilledSquares.txt","w");
    fclose(FOUT);
    FOUT=fopen("CombiSquares.txt","w");
    fclose(FOUT);
 
    printf("Введите количество фигур-контуров: ");
    scanf("%d",&numb);
    Figures<Square> STable(numb);
    printf("Введите количество закрашенных фигур: ");
    scanf("%d",&numb);
    Figures<FilledSquare> FSTable(numb);
    printf("Введите количество комбинированных фигур: ");
    scanf("%d",&numb);
    Figures<CombiSquare> CSTable(numb);
 
    system("cls");
 
    MoveWindow(hwnd,0,0,1000,780,TRUE);
 
    commandlist(1);
 
    while (COMMAND!=4)
    {
        printf("Введите команду: ");
        scanf("%d",&COMMAND);
        
        if (COMMAND==0) commandlist(1);
        else
            if (COMMAND==1)
            {
                pS=&S;
                pS->type=1;
            }                   
            else
                if (COMMAND==2)
                {
                    pS=&FS;
                    pS->type=2;
                }
                else
                    if (COMMAND==3)
                    {
                        pS=&CS;
                        pS->type=3;
                    }
                    else
                        if (COMMAND!=4) printf("Неверная команда!\n");
        if ((COMMAND==1)||(COMMAND==2)||(COMMAND==3))
        {           
            while (COMMAND!=9)
            {
                COMMAND=-1;
                system("cls");
                commandlist(2);
                
                printf("Введите команду: ");
                scanf("%d",&COMMAND);
                if (COMMAND==0) commandlist(2);
                else
                    if (COMMAND==1)
                    {
                        pS->load_Coord();
                        pS->load_Sett();
                    }
                    else
                        if (COMMAND==2)
                        {
                            pS->DRAW(hwnd,hdc);
                        }
                        else
                            if (COMMAND==3)
                            {
                                pS->clearscreen(hwnd,hdc);
                            }
                            else
                                if (COMMAND==4)
                                {
                                    COMMAND=-1;
                                    while (COMMAND!=5)
                                    {
                                        system("cls");
                                        commandlist(3);
                                        printf("Введите команду: ");
                                        scanf("%d",&COMMAND);
 
                                        if (COMMAND==0) commandlist(3);
                                        else
                                            if (COMMAND==1)
                                            {
                                                printf("Введите смещение: ");
                                                scanf("%d",&delta);
                                                pS->shift(1,delta);
                                                pS->clearscreen(hwnd,hdc);
                                                pS->DRAW(hwnd,hdc);
                                            }
                                            else
                                                if (COMMAND==2)
                                                {
                                                    printf("Введите смещение: ");
                                                    scanf("%d",&delta);
                                                    pS->shift(2,delta);
                                                    pS->clearscreen(hwnd,hdc);
                                                    pS->DRAW(hwnd,hdc);
                                                }
                                                else
                                                    if (COMMAND==3)
                                                    {
                                                        printf("Введите смещение: ");
                                                        scanf("%d",&delta);
                                                        pS->shift(3,delta);
                                                        pS->clearscreen(hwnd,hdc);
                                                        pS->DRAW(hwnd,hdc);
                                                    }
                                                    else
                                                        if (COMMAND==4)
                                                        {
                                                            printf("Введите смещение: ");
                                                            scanf("%d",&delta);
                                                            pS->shift(4,delta);
                                                            pS->clearscreen(hwnd,hdc);
                                                            pS->DRAW(hwnd,hdc);
                                                        }
                                                        else
                                                            if (COMMAND!=5) printf("Неверная команда!\n");
                                    }
                                    COMMAND=-1;
                                    system("cls");
                                    commandlist(2);
                                }
                                else
                                    if (COMMAND==5)
                                    {
                                        printf("Введите ключ: ");
                                        scanf("%d",&key);
                                        if (pS->type==1) STable.add(S,key);
                                        else
                                            if (pS->type==2) FSTable.add(FS,key);
                                            else
                                                if (pS->type==3) CSTable.add(CS,key);
                                    }
                                    else
                                        if (COMMAND==6)
                                        {
                                            printf("Введите ключ: ");
                                            scanf("%d",&key);
                                            if (pS->type==1) 
                                            {
                                                if (STable.search(key,&pos)==1)
                                                {
                                                    pS=&STable.get(pos);
                                                    pS->DRAW(hwnd,hdc);
                                                }
                                            }
                                            else
                                                if (pS->type==2) 
                                                {
                                                    if (FSTable.search(key,&pos)==1)
                                                    {
                                                        pS=&FSTable.get(pos);
                                                        pS->DRAW(hwnd,hdc);
                                                    }
                                                }
                                                else
                                                    if (pS->type==3) 
                                                    {
                                                        if (CSTable.search(key,&pos)==1)
                                                        {
                                                            pS=&CSTable.get(pos);
                                                            pS->DRAW(hwnd,hdc);
                                                        }
                                                    }
                                        }
                                        else
                                            if (COMMAND==7)
                                            {
                                                printf("Введите ключ: ");
                                                scanf("%d",&key);
                                                if (pS->type==1) STable.del(key);
                                                else
                                                    if (pS->type==2) FSTable.del(key);
                                                    else
                                                        if (pS->type==3) CSTable.del(key);
                                            }
                                            else
                                                if (COMMAND==8)
                                                {
                                                    if (pS->type==1) 
                                                    {
                                                        STable.save();
                                                    }
                                                    else
                                                        if (pS->type==2) 
                                                        {
                                                            FSTable.save();
                                                        }
                                                        else
                                                            if (pS->type==3) 
                                                            {
                                                                CSTable.save();
                                                            }
                                                }
                                                else
                                                    if (COMMAND!=9) printf("Неверная команда!\n");
            }
            COMMAND=-1;
            system("cls");
            commandlist(1);
        }
    }
    ReleaseDC(hwnd,hdc);
}
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:22 16
Цитата Сообщение от Quadra Посмотреть сообщение
Окей.
И где там, в .h файле, #include <cstdio>?
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 17:26  [ТС] 17
Цитата Сообщение от alsav22 Посмотреть сообщение
И где там, в .h файле, #include <cstdio>?
Он в майне. В такой связке никогда проблем не было. Если перенести в .h злится линкер, как раз на эту функцию.

Ошибка 47 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class CombiSquare>::save(void)" (?save@?$Figures@VCombiSquare@@@@QAEXXZ) в функции _main Main.obj

Ошибка 48 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class FilledSquare>::save(void)" (?save@?$Figures@VFilledSquare@@@@QAEXXZ) в функции _main Main.obj

Ошибка 49 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class Square>::save(void)" (?save@?$Figures@VSquare@@@@QAEXXZ) в функции _main Main.obj
При конструкции

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<class Type>void Figures<Type>::save()
{
    int i;
    FILE *fout;
 
    fout=fopen("Squares.txt","w");
    for (i=0;i<place;i++)
    {
        fprintf(fout,"ID фигуры: %d\n",M[i].ID);
        fprintf(fout,"Координаты: %d %d %d %d\n",M[i].data.A,M[i].data.B);
        fprintf(fout,"Стиль пера: %s Размер: %d Цвет: RGB(%d,%d,%d)\n",M[i].data.PenStyle,M[i].data.Pensize,M[i].data.PenColor.Red,M[i].data.PenColor.Green,M[i].data.PenColor.Blue);
        fprintf(fout,"\n\n\n");
    }
    fclose(fout);
}
независимо от положения строки <cstdio> между файлами код компилится. Но эта функция будет вызываться при любом Type. Мне же нужно чтобы именно эта реализация реагировала именно на Square.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.11.2013, 17:27 18
Цитата Сообщение от Quadra Посмотреть сообщение
Он в майне.
И что? Как это должно влиять на .h файл?
0
10 / 10 / 0
Регистрация: 29.04.2013
Сообщений: 145
29.11.2013, 17:31  [ТС] 19
Цитата Сообщение от alsav22 Посмотреть сообщение
И что? Как это должно влиять на .h файл?
Всегда так делал, никогда такой ошибки не возникало. Почему?
0
Неэпический
18106 / 10693 / 2062
Регистрация: 27.09.2012
Сообщений: 26,918
Записей в блоге: 1
29.11.2013, 17:40 20
Цитата Сообщение от Quadra Посмотреть сообщение
Но эта функция будет вызываться при любом Type. Мне же нужно чтобы именно эта реализация реагировала именно на Square.
Если тип будет Square, то будет использована специализация, а для других типов будет использоваться общая функция.
В данном случае у Вас есть специализация для Square, но нет реализации функции для других типов:
Цитата Сообщение от Quadra Посмотреть сообщение
Ошибка 47 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class CombiSquare>::save(void)" (?save@?$Figures@VCombiSquare@@@@QAEXXZ) в функции _main Main.obj
Ошибка 48 error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Figures<class FilledSquare>::save(void)" (?save@?$Figures@VFilledSquare@@@@QAEXXZ) в функции _main Main.obj
Добавлено через 5 минут
У Вас в коде вообще отсутствуют реализации целой тучи функций
1
29.11.2013, 17:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2013, 17:40
Помогаю со студенческими работами здесь

специализация шаблона
Добрый день! Хотелось бы сделать шаблонную функцию, у которой будет различная реализация в...

Специализация шаблона
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор:...

Частичная специализация шаблона
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса ...

Явная специализация шаблона
Здравствуйте. Не совсем разобрася с сабжем. Например, если есть кусочек кода: template &lt;typename...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru