Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144

Массив объектов внутри объекта. Как получить доступ к элементу?

30.07.2018, 21:01. Показов 2941. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Есть класс для матриц
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
template <typename X>
class массив {
protected:
    int числоСтрок; // m
    int числоСтолбцов; // n
 
    mutable X **указательСтрока; // указатель на массив (на строки)
    X *указательЭлемент; // указатель на элементы строк
    X *конецСтроки; // указатель на конец строки
 
    X **началоМассива; // указатель на начало массива
 
    математика типМатрицы;
 
    bool признакВременности = false;
 
    inline static int счётчикНомеров = 1; // рабочая переменная
    int номерОбъекта; // рабочая переменная
 
public:
    массив <X> &operator+=(массив <X> &объект);
    массив <X> &T(); // функция транспонирования матрицы
    template <typename Y>
    массив <Y> Tблочная(массив <Y> &объект); // функция транспонирования блочной матрицы
}
Внутри класса определены всякие операторы и функции. С встроенными типами (массив <double>) все работает.
Если создаю объект массив <массив<double>>, то перегруженные операторы тоже работают. Но когда пытаюсь применить функции к элементам массива (к массив <double>, например this->Tблочная(массивОбъекта[столбец][строка - столбец])), то компилятор выдает ошибку, "error C2678: бинарный "+=": не найден оператор, принимающий левый операнд типа "массив<double>" (или приемлемое преобразование отсутствует)".
Все перепробовал. Всякие ошибки (например, что элемент должен быть структурой или классом).
Подскажите, пожалуйста, что сделать

Добавлено через 7 минут
Сразу извините, что все на русском
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2018, 21:01
Ответы с готовыми решениями:

Доступ к элементу объекта в векторе
Есть два класса. Второй класс содержит вектор объектов первого. Причем конструктор второго класса обращается к элементам первого. Если...

Qsort() Как отсортировать массив объектов по полю объекта
Здравствуйте! Никак не могу сладить с функцией qsort(). У меня есть класс, и в нем нужно сделать сортировку по ОДНОМУ элементу...

Правильное удаление массива объектов внутри другого объекта
Есть, предположим, два класса: struct vec { int* vector; vec(int lengt) { vector = new int; } ~vec() {

17
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
31.07.2018, 22:10  [ТС]
не знаю как запустить метод объекта. но раз перегруженные операторы работают, просто тупо перегрузил оператор "!" и заработало
0
 Аватар для vlisp
1059 / 980 / 153
Регистрация: 10.08.2015
Сообщений: 5,317
01.08.2018, 07:47
настоятельно не рекомендуется использовать кириллицу в коде на с++
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
01.08.2018, 09:18  [ТС]
спасибо за совет. а не подскажите почему это не рекомендуется
0
 Аватар для COKPOWEHEU
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,887
01.08.2018, 09:25
Code
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
$ g++ main.cpp
main.cpp:6:7: error: stray ‘\320’ in program
 class ��ассив {
       ^
main.cpp:6:8: error: stray ‘\274’ in program
 class ��ассив {
        ^
main.cpp:6:9: error: stray ‘\320’ in program
 class м��ссив {
         ^
main.cpp:6:10: error: stray ‘\260’ in program
 class м��ссив {
          ^
main.cpp:6:11: error: stray ‘\321’ in program
 class ма��сив {
           ^
main.cpp:6:12: error: stray ‘\201’ in program
 class ма��сив {
            ^
main.cpp:6:13: error: stray ‘\321’ in program
 class мас��ив {
             ^
main.cpp:6:14: error: stray ‘\201’ in program
 class мас��ив {
              ^
main.cpp:6:15: error: stray ‘\320’ in program
 class масс��в {
               ^
main.cpp:6:16: error: stray ‘\270’ in program
 class масс��в {
                ^
main.cpp:6:17: error: stray ‘\320’ in program
 class масси�� {
                 ^
main.cpp:6:18: error: stray ‘\262’ in program
 class масси�� {
                  ^
main.cpp:8:9: error: stray ‘\321’ in program
     int ��ислоСтрок; // m
         ^
main.cpp:8:10: error: stray ‘\207’ in program
     int ��ислоСтрок; // m
          ^
main.cpp:8:11: error: stray ‘\320’ in program
     int ч��слоСтрок; // m
           ^
main.cpp:8:12: error: stray ‘\270’ in program
     int ч��слоСтрок; // m
            ^
main.cpp:8:13: error: stray ‘\321’ in program
     int чи��лоСтрок; // m
             ^
main.cpp:8:14: error: stray ‘\201’ in program
     int чи��лоСтрок; // m
              ^
main.cpp:8:15: error: stray ‘\320’ in program
     int чис��оСтрок; // m
               ^
main.cpp:8:16: error: stray ‘\273’ in program
     int чис��оСтрок; // m
                ^
main.cpp:8:17: error: stray ‘\320’ in program
     int числ��Строк; // m
                 ^
main.cpp:8:18: error: stray ‘\276’ in program
     int числ��Строк; // m
                  ^
main.cpp:8:19: error: stray ‘\320’ in program
     int число��трок; // m
                   ^
main.cpp:8:20: error: stray ‘\241’ in program
     int число��трок; // m
                    ^
main.cpp:8:21: error: stray ‘\321’ in program
     int числоС��рок; // m
                     ^
main.cpp:8:22: error: stray ‘\202’ in program
     int числоС��рок; // m
                      ^
main.cpp:8:23: error: stray ‘\321’ in program
     int числоСт��ок; // m
                       ^
main.cpp:8:24: error: stray ‘\200’ in program
     int числоСт��ок; // m
                        ^
main.cpp:8:25: error: stray ‘\320’ in program
     int числоСтр��к; // m
                         ^
main.cpp:8:26: error: stray ‘\276’ in program
     int числоСтр��к; // m
                          ^
main.cpp:8:27: error: stray ‘\320’ in program
     int числоСтро��; // m
                           ^
main.cpp:8:28: error: stray ‘\272’ in program
     int числоСтро��; // m
                            ^
main.cpp:9:9: error: stray ‘\321’ in program
     int ��ислоСтолбцов; // n
         ^
main.cpp:9:10: error: stray ‘\207’ in program
     int ��ислоСтолбцов; // n
          ^
main.cpp:9:11: error: stray ‘\320’ in program
     int ч��слоСтолбцов; // n
           ^
main.cpp:9:12: error: stray ‘\270’ in program
     int ч��слоСтолбцов; // n
            ^
main.cpp:9:13: error: stray ‘\321’ in program
     int чи��лоСтолбцов; // n
             ^
main.cpp:9:14: error: stray ‘\201’ in program
     int чи��лоСтолбцов; // n
              ^
main.cpp:9:15: error: stray ‘\320’ in program
     int чис��оСтолбцов; // n
               ^
main.cpp:9:16: error: stray ‘\273’ in program
     int чис��оСтолбцов; // n
                ^
main.cpp:9:17: error: stray ‘\320’ in program
     int числ��Столбцов; // n
                 ^
main.cpp:9:18: error: stray ‘\276’ in program
     int числ��Столбцов; // n
                  ^
main.cpp:9:19: error: stray ‘\320’ in program
     int число��толбцов; // n
                   ^
main.cpp:9:20: error: stray ‘\241’ in program
     int число��толбцов; // n
                    ^
main.cpp:9:21: error: stray ‘\321’ in program
     int числоС��олбцов; // n
                     ^
main.cpp:9:22: error: stray ‘\202’ in program
     int числоС��олбцов; // n
                      ^
main.cpp:9:23: error: stray ‘\320’ in program
     int числоСт��лбцов; // n
                       ^
main.cpp:9:24: error: stray ‘\276’ in program
     int числоСт��лбцов; // n
                        ^
main.cpp:9:25: error: stray ‘\320’ in program
     int числоСто��бцов; // n
                         ^
main.cpp:9:26: error: stray ‘\273’ in program
     int числоСто��бцов; // n
                          ^
main.cpp:9:27: error: stray ‘\320’ in program
     int числоСтол��цов; // n
                           ^
main.cpp:9:28: error: stray ‘\261’ in program
     int числоСтол��цов; // n
                            ^
main.cpp:9:29: error: stray ‘\321’ in program
     int числоСтолб��ов; // n
                             ^
main.cpp:9:30: error: stray ‘\206’ in program
     int числоСтолб��ов; // n
                              ^
main.cpp:9:31: error: stray ‘\320’ in program
     int числоСтолбц��в; // n
                               ^
main.cpp:9:32: error: stray ‘\276’ in program
     int числоСтолбц��в; // n
                                ^
main.cpp:9:33: error: stray ‘\320’ in program
     int числоСтолбцо��; // n
                                 ^
main.cpp:9:34: error: stray ‘\262’ in program
     int числоСтолбцо��; // n
                                  ^
main.cpp:11:17: error: stray ‘\321’ in program
     mutable X **��казательСтрока; // указатель на массив (на строки)
                 ^
main.cpp:11:18: error: stray ‘\203’ in program
     mutable X **��казательСтрока; // указатель на массив (на строки)
                  ^
main.cpp:11:19: error: stray ‘\320’ in program
     mutable X **у��азательСтрока; // указатель на массив (на строки)
                   ^
main.cpp:11:20: error: stray ‘\272’ in program
     mutable X **у��азательСтрока; // указатель на массив (на строки)
                    ^
main.cpp:11:21: error: stray ‘\320’ in program
     mutable X **ук��зательСтрока; // указатель на массив (на строки)
                     ^
main.cpp:11:22: error: stray ‘\260’ in program
     mutable X **ук��зательСтрока; // указатель на массив (на строки)
                      ^
main.cpp:11:23: error: stray ‘\320’ in program
     mutable X **ука��ательСтрока; // указатель на массив (на строки)
                       ^
main.cpp:11:24: error: stray ‘\267’ in program
     mutable X **ука��ательСтрока; // указатель на массив (на строки)
                        ^
main.cpp:11:25: error: stray ‘\320’ in program
     mutable X **указ��тельСтрока; // указатель на массив (на строки)
                         ^
main.cpp:11:26: error: stray ‘\260’ in program
     mutable X **указ��тельСтрока; // указатель на массив (на строки)
                          ^
main.cpp:11:27: error: stray ‘\321’ in program
     mutable X **указа��ельСтрока; // указатель на массив (на строки)
                           ^
main.cpp:11:28: error: stray ‘\202’ in program
     mutable X **указа��ельСтрока; // указатель на массив (на строки)
                            ^
main.cpp:11:29: error: stray ‘\320’ in program
     mutable X **указат��льСтрока; // указатель на массив (на строки)
                             ^
main.cpp:11:30: error: stray ‘\265’ in program
     mutable X **указат��льСтрока; // указатель на массив (на строки)
                              ^
main.cpp:11:31: error: stray ‘\320’ in program
     mutable X **указате��ьСтрока; // указатель на массив (на строки)
                               ^
main.cpp:11:32: error: stray ‘\273’ in program
     mutable X **указате��ьСтрока; // указатель на массив (на строки)
                                ^
main.cpp:11:33: error: stray ‘\321’ in program
     mutable X **указател��Строка; // указатель на массив (на строки)
                                 ^
main.cpp:11:34: error: stray ‘\214’ in program
     mutable X **указател��Строка; // указатель на массив (на строки)
                                  ^
main.cpp:11:35: error: stray ‘\320’ in program
     mutable X **указатель��трока; // указатель на массив (на строки)
                                   ^
main.cpp:11:36: error: stray ‘\241’ in program
     mutable X **указатель��трока; // указатель на массив (на строки)
                                    ^
main.cpp:11:37: error: stray ‘\321’ in program
     mutable X **указательС��рока; // указатель на массив (на строки)
                                     ^
main.cpp:11:38: error: stray ‘\202’ in program
     mutable X **указательС��рока; // указатель на массив (на строки)
                                      ^
main.cpp:11:39: error: stray ‘\321’ in program
     mutable X **указательСт��ока; // указатель на массив (на строки)
                                       ^
main.cpp:11:40: error: stray ‘\200’ in program
     mutable X **указательСт��ока; // указатель на массив (на строки)
                                        ^
main.cpp:11:41: error: stray ‘\320’ in program
     mutable X **указательСтр��ка; // указатель на массив (на строки)
                                         ^
main.cpp:11:42: error: stray ‘\276’ in program
     mutable X **указательСтр��ка; // указатель на массив (на строки)
                                          ^
main.cpp:11:43: error: stray ‘\320’ in program
     mutable X **указательСтро��а; // указатель на массив (на строки)
                                           ^
main.cpp:11:44: error: stray ‘\272’ in program
     mutable X **указательСтро��а; // указатель на массив (на строки)
                                            ^
main.cpp:11:45: error: stray ‘\320’ in program
     mutable X **указательСтрок��; // указатель на массив (на строки)
                                             ^
main.cpp:11:46: error: stray ‘\260’ in program
     mutable X **указательСтрок��; // указатель на массив (на строки)
                                              ^
main.cpp:6:1: error: template class without a name
 class массив {
 ^~~~~
main.cpp:15:1: error: multiple types in one declaration
 int main(){
 ^~~
Это первая причина: такой код просто не компилируется.
Вторая причина: так принято. Язык общения программистов - английский. Вам бы понравилось читать чужой код, в котором переменные названы по-китайски?
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
04.09.2018, 19:59  [ТС]
похоже, что проблема решается использованием if-constexpr
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
04.09.2018, 22:02
большой ДЕН, не вижу в твоем классе конструктора копирования, деструктора, оператора присваивания. Они обязательно нужны.

Добавлено через 1 минуту
Цитата Сообщение от большой ДЕН Посмотреть сообщение
то компилятор выдает ошибку,
Поконкретнее опиши пример, на котором возникает ошибка.
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
04.09.2018, 22:37  [ТС]
nonedark2008, да это все есть - конструкторы, перегруженные опрераторы и все такое. я их сюда не привел. проблема вот такая.
есть класс (уж извините, ребята, у меня все идентификаторы на русском - Visual Studio позволяет)
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
template <typename X>
class массив {
protected:
    int числоСтрок; // m
    int числоСтолбцов; // n; для ленточныях матриц - полуширина матриц (с учётом главной диагонали)
 
    mutable X **указательСтрока; // указатель на массив (на строки)
    X *указательЭлемент; // указатель на элементы строк
    X *конецСтроки; // указатель на конец строки
 
    X **началоМассива; // указатель на начало массива
 
    математика типМатрицы;
 
    bool признакВременности = false; // признак временной матрицы - результата сложения, умножения и т.п. - для передачи для присваивания
 
    inline static int счётчикНомеров = 1; // рабочая переменная
    int номерОбъекта; // рабочая переменная
public:
    массив() {
        // конструктор - "пустой" массив
 
        this->числоСтрок = 0;
        this->числоСтолбцов = 0;
        this->типМатрицы = математика::пустаяМатрица;
 
        указательСтрока = nullptr;
 
        началоМассива = указательСтрока;
 
        номерОбъекта = счётчикНомеров++;
        cout << "КОНСТРУКТОР ПУСТОЙ " << номерОбъекта << '\n';
    }
    массив(int числоСтрок, int числоСтолбцов, математика типМатрицы) {
        // конструктор
 
        this->числоСтрок = числоСтрок;
        this->числоСтолбцов = числоСтолбцов;
        this->типМатрицы = типМатрицы;
 
        указательСтрока = создатьМассив(this->числоСтрок, this->числоСтолбцов, this->типМатрицы);
 
        началоМассива = указательСтрока;
 
        номерОбъекта = счётчикНомеров++;
        cout << "КОНСТРУКТОР " << номерОбъекта << '\n';
    }
    массив(массив <X> &объект) {
        // конструктор копии
        номерОбъекта = счётчикНомеров++;
        cout << "КОНСТРУКТОР КОПИИ " << номерОбъекта << '\n';
 
        this->числоСтрок = объект.числоСтрок;
        this->числоСтолбцов = объект.числоСтолбцов;
        this->типМатрицы = объект.типМатрицы;
 
        if (объект.вернутьПризнакВременности()) забратьМассив(объект);
        else {
            указательСтрока = создатьМассив(this->числоСтрок, this->числоСтолбцов, this->типМатрицы);
            копироватьМассив(объект);
        }
 
        началоМассива = указательСтрока;
 
        проверкаНаВременность(объект);
    }
    массив(массив <X> *объект) {
        // конструктор копии
        номерОбъекта = счётчикНомеров++;
        cout << "КОНСТРУКТОР КОПИИ " << номерОбъекта << '\n';
 
        this->числоСтрок = объект->числоСтрок;
        this->числоСтолбцов = объект->числоСтолбцов;
        this->типМатрицы = объект->типМатрицы;
 
        if (объект->вернутьПризнакВременности()) забратьМассив(объект);
        else {
            указательСтрока = создатьМассив(this->числоСтрок, this->числоСтолбцов, this->типМатрицы);
            копироватьМассив(*объект);
        }
 
        началоМассива = указательСтрока;
 
        проверкаНаВременность(объект);
    }
    ~массив() {
        указательСтрока = началоМассива;
 
        if (типМатрицы == математика::нулеваяМатрица || типМатрицы == математика::единичнаяМатрица) числоСтрок = 0;
 
        for (int i = 0; i < this->числоСтрок; i++, указательСтрока++) delete[] * указательСтрока;
        указательСтрока = началоМассива;
        delete[] указательСтрока;
 
        cout << "ДЕструктОР " << номерОбъекта << '\n';
    }
}
внутри создается динамический массив. Допустим есть функция транспонирования матрицы
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
массив <X> &T() {
        // транспонирование матрицы
 
        массив <X> *временныйМассив;
 
X **строкаВременный;
        X *элементВременный, *конецСтроки;
 
        this->указательСтрока = this->началоМассива;
 
 
        for (int строка = 0; строка < временныйМассив->числоСтрок; строка++, строкаВременный++) {
            int столбец = 0;
                for (элементВременный = *строкаВременный, конецСтроки = элементВременный + временныйМассив->вернутьЧислоСтолбцов(строка); 
                    элементВременный < конецСтроки; столбец++, элементВременный++) *элементВременный = this->указательСтрока[столбец][строка];
        }
        строкаВременный -= временныйМассив->числоСтрок;
 
        временныйМассив->установитьПризнакВременности();
 
        return *временныйМассив;
    }
Тут, чтобы не загромождать я привел только часть её. Так вот, в чём проблема: если тип шаблона класса любой встроенный тип (например double) то функция T() для объекта работает отлично (например объект.T()). Но если я делаю тип массив<массив<double>> (т.е. элементами массива объекта будут такие же объекты-матрицы с элементами double), то вот такую операцию для элемента массива сделать не получается: указательСтрока[i][j].T();
C++
1
2
3
4
5
массив <double> object1;
object1.T(); // тут ОК
 
массив <массив<double>> object2;
object2.началоМассива[i][j].T(); // тут ошибка
Т.е. компилятор говорит, что если типом класса будет встроенный тип (например double), то для такого элемента массива функция T() не определена. По-этому приходилось перегружать унарный оператор. Но ведь для всех функций операторов не напасёшся.
И вот прочитал в книжке про принятие решения во время компиляции с помощью constexpr-if. Для сложения написал вот, что
C++
1
2
3
4
5
6
7
8
9
10
if constexpr (признакБлочностиМатрицы() == математика::блочнаяМатрица) {
                        for (; this->указательЭлемент < this->конецСтроки; ++столбец, ++this->указательЭлемент)
                                *this->указательЭлемент = -1 * массивОбъекта[столбец][строка - столбец].T();
                    }
                    else {
                        // элементная (числовая) матрица
 
                        for (; this->указательЭлемент < this->конецСтроки; ++столбец, ++this->указательЭлемент)
                                *this->указательЭлемент = -1 * массивОбъекта[столбец][строка - столбец];
                    }
вроде бы скомпилировалось. но еще не проверял

Добавлено через 6 минут
Если есть какой-то общеизвестный способ обойти эту проблему, умоляю, расскажите
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
05.09.2018, 00:35
Цитата Сообщение от большой ДЕН Посмотреть сообщение
// признак временной матрицы
Фигня какая-то. Если у тебя есть корректно определенные конструктор, деструктор и оператор присваивания, то в таком необходимости нет.

Цитата Сообщение от большой ДЕН Посмотреть сообщение
общеизвестный способ обойти
Перегруженная функция транспонирования, которая вызывает .T(), если передана переменная типа массив, и не делает ничего в противном случае.

Добавлено через 21 минуту
Цитата Сообщение от большой ДЕН Посмотреть сообщение
if constexpr (признакБлочностиМатрицы() == математика::блочнаяМатрица) {
Чтобы такое работало, необходимо, чтобы признакБлочностиМатрицы() и математика типМатрицы; были constexpr. Я сомневаюсь, что в твоем коде это условие выполняется.
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
05.09.2018, 00:41  [ТС]
Перегруженная функция транспонирования, которая вызывает .T(), если передана переменная типа массив, и не делает ничего в противном случае.
вызывать для каждого элемента функцию получится слишком "дорого". я перегрузил опреатор "!". в там был такой код
C++
1
2
3
4
5
массив <X> &operator!() {
        // транспонирование элемента блочной матрицы
 
        return this->T();
    }
вот такое "двухэтажное" вложение компилятор уже не видел и все собиралось нормально
Чтобы такое работало, необходимо, чтобы признакБлочностиМатрицы() и математика типМатрицы; были constexpr.
там вроде все зависит только от первого условия if constexpr.
C++
1
2
3
4
5
6
математика признакБлочностиМатрицы() {
        // определение блочности матрицы
 
        if (номерТипаДанных() > 20) return математика::блочнаяМатрица;
        else return математика::элементнаяМатрица;
    }
а номерТипаДанных() зависит от типа объекта. В коде он уже определен. И похоже компилятор его все-таки может высчитать
буду смотреть заработает ли
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
05.09.2018, 23:56  [ТС]
не сработало

Добавлено через 27 минут
не получается. пишет error C2228: выражение слева от ".T" должно представлять класс, структуру или объединение
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
06.09.2018, 00:38
большой ДЕН, это могло бы выглядеть примерно вот так:
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
#include <algorithm>
 
template<typename T>
class matrix
{
public:
    matrix()
    {
        init(0, 0);
    }
 
    matrix(size_t m, size_t n)
    {
        init(m, n);
    }
 
    matrix(const matrix &a)
    {
        *this = a;
    }
 
    ~matrix()
    {
        clear();
    }
 
    matrix & init(size_t m, size_t n)
    {
        clear();
        m_M = m;
        m_N = n;
        m_ppData = new T *[m_M];
        for (size_t i = 0; i < m_M; ++i) 
            m_ppData[i] = new T[m_N];
        return *this;
    }
 
    matrix & clear()
    {
        for (size_t i = 0; i < m_M; ++i)
            delete[] m_ppData[i];
        delete[] m_ppData;
        m_ppData = nullptr;
        m_M = m_N = 0;
        return *this;
    }
 
    T * operator [](size_t m)
    {
        return m_ppData[m];
    }
 
    const T * operator[] (size_t m) const
    {
        return m_ppData[m];
    }
 
    matrix & operator = (const matrix &a)
    {
        if (this != &a)
        {
            init(a.m_M, a.m_N);
            for (size_t i = 0; i < m_M; ++i)
                std::copy_n(a[i], m_N, m_ppData[i]);
        }
 
        return *this;
    }
 
    matrix transpose() const
    {
        matrix a(m_N, m_M);
        for (size_t i = 0; i < m_M; ++i)
        {
            for (size_t j = 0; j < m_N; ++j) 
            {
                if constexpr (can_transpose<T>::value)
                    a[j][i] = m_ppData[i][j].transpose();
                else
                    a[j][i] = m_ppData[i][j];
            }
        }
 
        return a;
    }
 
private:
    T **m_ppData = nullptr;
    size_t m_M = 0, m_N = 0;
 
    template<typename T2>
    struct can_transpose
    {
        static constexpr bool value = false;
    };
 
    template<typename T2>
    struct can_transpose<matrix<T2>>
    {
        static constexpr bool value = true;
    };
};
 
int main()
{
    matrix<int> a(1, 2);
    a[0][0] = 0; a[0][1] = 1;
    matrix<matrix<int>> b(1, 2);
    b[0][0] = a; b[0][1] = a;
    auto c = b.transpose();
}
1
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
06.09.2018, 01:26  [ТС]
если, честно не совсем понял. а как это вы сделали оператор индексации из двух скобок?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
06.09.2018, 08:04
большой ДЕН, для любого класса можно перегрузить операторы [], (). Первый позволяет работать с объектом, как с массивом, второй - как с функцией. Перегружаются аналогично всем другим операторам.
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
06.09.2018, 11:23  [ТС]
это понятно. но у вас с объектом работает сразу два оператора [][] как для обычного массива
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.09.2018, 12:57
большой ДЕН, ну так оператор класса возвращает указатель, а к указателю тоже можно применить [], вот и получается, что два раза.
0
1 / 1 / 0
Регистрация: 01.05.2017
Сообщений: 144
06.09.2018, 18:58  [ТС]
а. то есть один [] это перегруженный оператор, а второй - это встроенный оператор?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
07.09.2018, 09:59
Цитата Сообщение от большой ДЕН Посмотреть сообщение
то есть один [] это перегруженный оператор, а второй - это встроенный оператор?
В данном случае да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2018, 09:59
Помогаю со студенческими работами здесь

Массив объектов. Как с помощью for_each увеличить некоторое поле объекта на N единиц?
Доброго времени суток! 1)Есть вектор из указателей на объекты. Как с помощью for_each()увеличить некоторое поле объекта на N...

Где и как создать массив объектов, чтобы можно было получить доступ к методам этих объектов?
Задача: &quot;в win form кликаю на кнопку (button) и в этот момент в одном из массивов экземпляров класса должен вызваться метод&quot; ...

получить доступ к элементу внутри TForm из функции
В общем пишу я сейчас игру &quot;крестики-нолики&quot; #include &lt;iostream&gt; #include &lt;vcl.h&gt; #pragma hdrstop #include...

Не получается получить доступ к элементу внутри DataTemplate
В чем моя ошибка, подскажите пожалуйста. VisualTreeHelper.GetChildrenCount(parent) - данный метод возвращает 0. &lt;DataGrid...

Получить доступ к элементу объекта document по его ID и изменить свойства элемента и его содержимое
Здравствуйте господа, нужен скрипт который будет выводить все свойства объекта, допустим &lt;div&gt; Спасибо:)


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru