Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11

Наследование: как передать массив одного класса другому классу?

22.01.2017, 14:19. Показов 7927. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток, нужна помощь. Не могу сотворить чудо. Сомневаюсь уже во всём. Как передать массив одного класса другому классу? Дабы наследник использовал свои функции для преобразования массива. И как этот преобразованный массив потом грамотно вывести?
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
class 1array
{
    int *massiv;
    int imax;
public:
    1array()                    
    {
        imax = 10;
 
        massiv = new int [imax];
        for (int i = 0; i < imax; i++)
        massiv[i] = 0;
    }
 
class 2array : public 1array
{
public:
 
        void f1 (int *massiv, int imax)
        {};
 
        void f2 (int *massiv, int imax)
        {};
 
};
 
int main()
{
    setlocale(LC_ALL, "Rus");
 
    1array A;
    cout << "Элементы массива" << endl;
        A.Vivod();
 
    2array B;
    cout << endl << "Элементы преобразованного массива" << endl;
    B.Vivod();
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2017, 14:19
Ответы с готовыми решениями:

Как передать параметры конструктора одного класса другому?
Скажите пожалуйста, как это должно работать? Как передать параметры конструктора одного класса другому? #include &lt;iostream&gt; ...

В чем заключается наследование одного класса другому?
Вообщем есть пара заданий теория ,можек кто-нибудь помочь и ответить на них 1. В чем заключается наследование одного класса другому? В...

Полиморфизм, наследование и приведение экземпляров класса одного к другому
Есть некий класс со своими переменными,его экземпляр занимает какое-то количество памяти. Интерфейс выглядит примерно так: /*...

36
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11
25.01.2017, 23:02  [ТС]
Студворк — интернет-сервис помощи студентам
gru74ik, Точнее сказать: функция выборки зануляет те элементы массива, которые не кратны числу chi

Добавлено через 1 минуту
gru74ik, инверсия - переворачивание, перестановка; выборка - сохранение значений кратных chi, а остальные элементы массива (которые не кратны chi) приравнять к нулю
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
25.01.2017, 23:22
Александр Зуев, надеюсь, вот так устроит Вас (потому что я уже спать):
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
using std::istream;
 
class Tarray
{
private:
    unsigned int size_;
    int* mas;
 
public:
 
    enum { DEFAULT_SIZE = 7 };
 
    Tarray() : size_( DEFAULT_SIZE ) // Конструктор по умолчанию
    {
        mas = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            mas[i] = 0;
    }
 
    Tarray( unsigned int sz ) : size_( sz )  // Конструктор с одним параметром
    {                                       // (рандомное заполнение массива)
        time_t t;
        srand( ( unsigned )time( &t ) );
        mas = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
        {
            mas[i] = rand() % 10;
        }
    }
 
    Tarray( const Tarray& v1 )    // Конструктор копирования
    {
        mas = new int[v1.size_];
        size_ = v1.size_;
        for ( unsigned int i = 0; i < size_; i++ )
        {
            mas[i] = v1.mas[i];
        }
    }
 
    ~Tarray()                   // Деструктор
    {
        delete mas;
    }
 
    void Vvod()                 // Ввод
    {
        for ( unsigned int i = 0; i < size_; i++ )
        {
            cout << "Enter " << i + 1 << " element of the array" << endl;
            cin >> mas[i];
        }
    }
 
    void set_size()
    {
        cout << "Enter array size: " << endl;
        cin >> size_;
    }
 
    unsigned int size() const
    {
        return size_;
    }
 
    int elem( unsigned int index ) const
    {
        return mas[index];
    }
 
    void set_elem( unsigned int index, int value )
    {
        mas[index] = value;
    }
 
    void Vivod()                        // Вывод
    {
        for ( unsigned int i = 0; i < size_; i++ )
        {
            cout << mas[i] << "\t";
        }
        cout << endl;
    }
 
    int sum() const
    {
        int sum_of_elements = 0;
        for ( unsigned int i = 0; i < size_; i++ )
            sum_of_elements += mas[i];
 
        return sum_of_elements;
    }
 
    void sort1()                        // Сортировка по возрастанию
    {
        int sorts = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - j; i++ )
            {
                if ( mas[i] > mas[i + 1] )
                {
                    sorts = mas[i];
                    mas[i] = mas[i + 1];
                    mas[i + 1] = sorts;
                }
            }
        }
    }
 
    void sort2()                        // Сортировка по возрастанию
    {
        int sorts = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - j; i++ )
            {
                if ( mas[i]<mas[i + 1] )
                {
                    sorts = mas[i];
                    mas[i] = mas[i + 1];
                    mas[i + 1] = sorts;
                }
            }
        }
    }
 
    friend ostream& operator<<( ostream& stream, const Tarray& obj )  // Перегрузка оператора вставки в поток
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
        {
            stream << " = " << obj.mas[i] << "\t";
        }
        return stream;
    }
 
    friend istream& operator>>( istream& stream, Tarray& obj )        // перегрузка оператора извлечения из потока
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
        {
            stream >> obj.mas[i];
        }
        return stream;
    }
 
    Tarray operator+( const Tarray &op1 )                           // Перегрузка оператора +
    {
        Tarray summ( op1 );
        for ( unsigned int i = 0; i < op1.size(); i++ )
        {
            summ.mas[i] += mas[i];
        }
        return summ;
    }
 
    Tarray& operator=( const Tarray &op1 )
    {
        for ( unsigned int i = 0; i < op1.size(); i++ )
        {
            mas[i] = op1.mas[i];
        }
        return *this; // Параметр доступа к текущему экземпляру класса
    }
 
};
 
class tTarray : public Tarray
{
    int chi_; // Число для выборки, которое должно передаваться как праметр функции
 
public:
    tTarray() : Tarray(), chi_ (0)
    {}
 
    tTarray( unsigned int sz ) : Tarray( sz ), chi_ (0)
    {}
 
    tTarray( unsigned int sz, int chi ) : Tarray( sz ), chi_ (chi)
    {}
 
    void set_criterion()
    {
        cout << "Enter criterion" << endl;
        cin >> chi_;
    }
 
    void reverse()          // Инверсия
    {
        int temp = 0;
        for ( unsigned int i = 0, j = size() - 1; i < size() / 2; i++, j-- )
        {
            temp = elem( i );
            set_elem( i, elem( j ) );
            set_elem( j , temp );
        }
    }
 
    void vyborka()    // Выборка
    {
        for ( unsigned int i = 0; i < size(); i++ )
        {
            if ( elem( i ) % chi_ != 0 )
            {
                set_elem( i, 0 );
            }
        }
    }
};
 
int main()
{
    Tarray B;
 
    cout << "Elements of the array:" << endl;
    B.Vivod();
 
    cout << endl << "Input of the elements:" << endl << endl;
    B.Vvod();
 
    cout << endl << "Output of the array that was entered (array B):" << endl;
    B.Vivod();
 
    Tarray C( B.size() );
 
    cout << endl << "Generated array (array C):" << endl;
    C.Vivod();
 
    Tarray D = B;
    cout << endl << "Copied array (array D):" << endl;
    D.Vivod();
 
    cout << endl << "If you want to sort your array in ascending order, enter 123" << endl;
    cout << "If you want to sort your array in descending order, enter 321" << endl << endl;
    int x;
    cin >> x;
 
    cout << endl << "Sorted array:" << endl;
    if ( x == 123 )
        D.sort1();
    if ( x == 321 )
        D.sort2();
    D.Vivod();
 
    Tarray S = B + C + D;
    cout << endl << "Summarized array (arrays B + C + D):" << endl;
    S.Vivod();
    cout << endl << "Summ of all elements of the array: " << S.sum() << endl;
 
    tTarray Z( 7 );
    cout << endl << "Inherited array (array Z):" << endl;
    Z.Vivod();
 
    Z.set_criterion();
    Z.reverse();
    cout << endl << "Inherited array after reversing (array Z):" << endl;
    Z.Vivod();
 
    Z.vyborka();
    cout << endl << "Inheritor:" << endl;
    Z.Vivod();
}
Миниатюры
Наследование: как передать массив одного класса другому классу?  
0
0 / 0 / 0
Регистрация: 22.01.2017
Сообщений: 11
26.01.2017, 09:16  [ТС]
gru74ik, Это круто!) Но в идеале нужно чтобы под строкой "Inherited array (array Z):" были те же числа, что и под "Summarized array (arrays B + C + D):"

Добавлено через 9 часов 23 минуты
gru74ik, Спасибо за уделённое время, ничего нового я в вашей коде (кроме как "Задать размерность класса наследника") не увидел, однако додумался сам Идея была спонтанной, наивной и (как мне по началу казалось), даже глупой)). В моём коде я сделал в int main вот такую штуку: "Z.mas=B.mas" и всё заработало как часы)) Но, тем не менее, вы внесли ценный вклад!) Благодарю)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.01.2017, 09:45
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
3
Tarray( const Tarray& v1 ) * *// Конструктор копирования
* * {
* * * * mas = new int[v1.size_];
А если там что-то было до этого, то получаем утечку.

Добавлено через 2 минуты
Цитата Сообщение от Александр Зуев Посмотреть сообщение
Z.mas=B.mas" и всё заработало как часы
Ага. И память рекой потекла. Разлилась, так сказать.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 18:11
GbaLog-, пока переделывал, ты уже написал
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 18:12
Александр Зуев, вот так сделал:
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
class Tarray
{
private:
    unsigned int size_;
    int* arr;
 
public:
 
    enum { DEFAULT_SIZE = 7 };
 
    Tarray() : size_( DEFAULT_SIZE ) // Конструктор по умолчанию
    {
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = 0;
    }
 
    Tarray( unsigned int sz ) : size_( sz )  // Конструктор с одним параметром
    {                                        // (рандомное заполнение массива)
        std::srand( std::time( 0 ) );
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = std::rand() % 10;
    }
 
    Tarray( const Tarray& obj ) // Конструктор копирования
    {
        if ( &obj != this && obj.size() == size_ )
            for ( unsigned int i = 0; i < size_; i++ )
                arr[i] = obj.arr[i];
    }
 
    ~Tarray() // Деструктор
    {
        delete arr;
    }
 
    unsigned int size() const
    {
        return size_;
    }
 
    int elem( unsigned int index ) const
    {
        return arr[index];
    }
 
    void set_elem( unsigned int index, int value )
    {
        arr[index] = value;
    }
 
    int sum() const
    {
        int sum_of_elements = 0;
        for ( unsigned int i = 0; i < size_; i++ )
            sum_of_elements += arr[i];
 
        return sum_of_elements;
    }
 
    void ascending_sort() // Сортировка по возрастанию
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] > arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    void descending_sort() // Сортировка по убыванию
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] < arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    friend std::ostream& operator<<( std::ostream& os, const Tarray& obj ) // Перегрузка оператора вставки в поток
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            os << obj.arr[i] << "\t";
        os << "\n";
        return os;
    }
 
    friend std::istream& operator>>( std::istream& is, Tarray& obj ) // перегрузка оператора извлечения из потока
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            is >> obj.arr[i];
 
        return is;
    }
 
    Tarray operator+( const Tarray &obj ) // Перегрузка оператора +
    {
        Tarray summ( obj.size() );
        for ( unsigned int i = 0; i < obj.size(); i++ )
            summ.arr[i] = arr[i] + obj.arr[i];
 
        return summ;
    }
 
    Tarray& operator=( const Tarray &obj )
    {
        if ( &obj != this )
            for ( unsigned int i = 0; i < obj.size(); i++ )
                arr[i] = obj.arr[i];
 
        return *this; // Параметр доступа к текущему экземпляру класса
    }
};
 
class tTarray : public Tarray
{
    int criterion_; // Число для выборки, которое должно передаваться как параметр функции
 
public:
    tTarray() : Tarray(), criterion_ ( 1 )
    {}
 
    tTarray( unsigned int sz ) : Tarray( sz ), criterion_ ( 1 )
    {}
 
    tTarray( unsigned int sz, int cr ) : Tarray( sz ), criterion_ ( cr )
    {}
 
    void set_criterion()
    {
        std::cout << "\nEnter criterion: ";
        std::cin >> criterion_;
    }
 
    int get_criterion() const
    {
        return criterion_;
    }
 
    void reverse() // Инверсия
    {
        int temp = 0;
        for ( unsigned int i = 0, j = size() - 1; i < size() / 2; i++, j-- )
        {
            temp = elem( i );
            set_elem( i, elem( j ) );
            set_elem( j , temp );
        }
    }
 
    template <typename Predicate>
    void reset_if( Predicate pred )
    {
        for ( unsigned int i = 0; i < size(); i++ )
            if ( pred( elem(i) ) )
                set_elem( i, 0 );
    }
};
 
int main()
{
    Tarray B;
    std::cout
        << "The elements of empty array:\n"
        << B
        << "\nEnter elements one by one:\n";
    std::cin >> B;
    std::cout
        << "\nOutput of the array that was entered (array B):\n"
        << B;
 
    Tarray C( B.size() );
    std::cout
        << "\nGenerated array (array C):\n"
        << C;
 
    Tarray D;
    D = B;
    std::cout
        << "\nCopied array (array D):\n"
        << D
        << "\nIf you want to sort your array in ascending order, enter 123."
        << "\nIf you want to sort your array in descending order, enter 321.\n";
    int user_choice;
    std::cin >> user_choice;
 
    std::cout << "\nSorted array:\n";
    if ( user_choice == 123 )
        D.ascending_sort();
    if ( user_choice == 321 )
        D.descending_sort();
    std::cout << D;
 
    Tarray S;
    S = B + C + D;
    std::cout
        << "\nSummarized array (arrays B + C + D):\n"
        << S
        << "\nSumm of all elements of the array: "
        << S.sum();
 
    tTarray Z( 7 );
    std::cout
        << "\n\nInherited array (array Z):\n"
        << Z;
 
    Z.reverse();
    std::cout
        << "\nInherited array after reversing (array Z):\n"
        << Z;
 
    Z.set_criterion();
    int num = Z.get_criterion();
    Z.reset_if( [num]( int elem ) { return elem % num; } );
    std::cout
        << "\nArray Z (inheritor) after selective resetting:\n"
        << Z;
}
GbaLog-, критикуй
Миниатюры
Наследование: как передать массив одного класса другому классу?  
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.01.2017, 18:20
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
3
arr = new int[size_];
* * * * for ( unsigned int i = 0; i < size_; i++ )
* * * * * * arr[i] = 0;
Если можно с++11 и выше, то можно заменить на arr = new int[size_]{};
Цитата Сообщение от gru74ik Посмотреть сообщение
if ( &obj != this && obj.size() == size_ )
Это вообще зачем? Типа не копируем, если размеры не совпадают? Зачем вообще, это же не массивы, размер которых изменить нельзя? Просто удаляем старый массив и копируем туда из переданного всё.
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
Tarray summ( obj.size() );
Если переделать конструктор копирования, то можно просто его вызвать.
Цитата Сообщение от gru74ik Посмотреть сообщение
C++
1
2
3
Tarray& operator=( const Tarray &obj )
* * {
* * * * if ( &obj != this )
Тут никаких проверок, что в this что-то есть вообще, будет черти что.
1
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 18:37
Цитата Сообщение от GbaLog- Посмотреть сообщение
Тут никаких проверок, что в this что-то есть
А какие нужны проверки? Что размеры массивов совпадают?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.01.2017, 18:40
Цитата Сообщение от gru74ik Посмотреть сообщение
А какие нужны проверки?
Подумайте, что будет происходить в этом коде "под капотом":
C++
1
2
3
Tarray arr1(10);
Tarray arr2(15);
arr1 = arr2;
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 18:41
GbaLog-, ну да, я про размеры массивов и подумал.
0
26.01.2017, 18:42

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
ну да, я про размеры массивов и подумал.
Просто сразу ответ говорить неинтересно. :)

0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 18:49
Александр Зуев, GbaLog-, мне вот только с полем criterion_ не очень понятно как поступать.
Зачем это число хранить как поле класса? Зачем передавать его в функцию? Должна ли функция быть функцией-членом или глобальной функцией? Если это глобальная функция, значит ей помимо этого числа надо и объект передавать. А если передавать объект, то зачем отдельно передавать это число? Ведь оно - поле объекта.
Если же это функция-член класса T, зачем ей данные-члены (поля) этого же класса T дополнительно передавать в качестве аргумента?
Бредятина какая-то... Архитектурная нелепица.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.01.2017, 18:55
Цитата Сообщение от gru74ik Посмотреть сообщение
мне вот только с полем criterion_ не очень понятно как поступать.
Удалить его и запрашивать в main, потом в лямбду передавать, которую в свою очередь передавать в reset_if.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 19:02
Цитата Сообщение от GbaLog- Посмотреть сообщение
Удалить его и запрашивать в main, потом в лямбду передавать, которую в свою очередь передавать в reset_if.
GbaLog-, хорошо бы, кабы так. Но вот незадача:
Цитата Сообщение от Александр Зуев Посмотреть сообщение
C++
1
int chi; // Число для выборки, которое должно передаваться как параметр функции
Добавлено через 57 секунд
Я так понял, что это элемент ТЗ. Ну, то есть, по условию задачи надо, чтобы это поле было.

Добавлено через 4 минуты
GbaLog-, если только вместо лямбды создать класс-функтор. Вот там это поле будет оправдано.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
26.01.2017, 19:02
gru74ik, А зачем вообще reset_if делать шаблоном?
P.S. Как вариант:
C++
1
2
Z.set_criterion();
Z.reset_if( [num = Z.get_criterion()]( int elem ) { return elem % num; } );
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 19:26
GbaLog-, можно и без шаблона. Я уже тоже думаю, надо меньше наворотов. И так сложно получилось для ТС.

Добавлено через 22 минуты
Сделал вот такой вариант:
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
#include <iostream>
#include <ctime>
#include <cstdlib>
 
class Tarray
{
private:
    unsigned int size_;
    int* arr;
 
public:
 
    enum { DEFAULT_SIZE = 7 };
 
    Tarray() : size_( DEFAULT_SIZE )
    {
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = 0;
    }
 
    Tarray( unsigned int sz ) : size_( sz )
    {
        std::srand( std::time( 0 ) );
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = std::rand() % 10;
    }
 
    Tarray( const Tarray& obj )
    {
        if ( &obj != this )
            for ( unsigned int i = 0; i < size_; i++ )
                arr[i] = obj.arr[i];
    }
 
    ~Tarray()
    {
        delete arr;
    }
 
    unsigned int size() const
    {
        return size_;
    }
 
    void resize( unsigned int sz )
    {
        delete arr;
        size_ = sz;
        std::srand( std::time( 0 ) );
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = std::rand() % 10;
    }
 
    int elem( unsigned int index ) const
    {
        return arr[index];
    }
 
    void set_elem( unsigned int index, int value )
    {
        arr[index] = value;
    }
 
    int sum() const
    {
        int sum_of_elements = 0;
        for ( unsigned int i = 0; i < size_; i++ )
            sum_of_elements += arr[i];
 
        return sum_of_elements;
    }
 
    void ascending_sort()
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] > arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    void descending_sort()
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] < arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    friend std::ostream& operator<<( std::ostream& os, const Tarray& obj )
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            os << obj.arr[i] << "\t";
        os << "\n";
        return os;
    }
 
    friend std::istream& operator>>( std::istream& is, Tarray& obj )
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            is >> obj.arr[i];
 
        return is;
    }
 
    Tarray operator+( const Tarray &obj )
    {
        Tarray summ( obj.size() );
        for ( unsigned int i = 0; i < obj.size(); i++ )
            summ.arr[i] = arr[i] + obj.arr[i];
 
        return summ;
    }
 
    Tarray& operator=( const Tarray &obj )
    {
        if ( &obj != this )
        {
            if ( obj.size() != size_ )
                resize( obj.size() );
 
            for ( unsigned int i = 0; i < obj.size(); i++ )
                arr[i] = obj.arr[i];
        }
 
 
        return *this;
    }
};
 
struct tTarray : public Tarray
{
    tTarray() : Tarray()
    {}
 
    tTarray( unsigned int sz ) : Tarray( sz )
    {}
 
    void reverse()
    {
        int temp = 0;
        for ( unsigned int i = 0, j = size() - 1; i < size() / 2; i++, j-- )
        {
            temp = elem( i );
            set_elem( i, elem( j ) );
            set_elem( j , temp );
        }
    }
 
    void reset_if_is_not_multiple_of( int number )
    {
        for ( unsigned int i = 0; i < size(); i++ )
            if ( elem( i ) % number )
                set_elem( i, 0 );
    }
};
 
int number()
{
    std::cout << "\nEnter an integer: ";
    int num = 0;
    std::cin >> num;
    return num;
}
 
int main()
{
    Tarray B;
    std::cout
        << "The elements of empty array:\n"
        << B
        << "\nEnter elements one by one:\n";
    std::cin >> B;
    std::cout
        << "\nOutput of the array that was entered (array B):\n"
        << B;
 
    Tarray C( B.size() );
    std::cout
        << "\nGenerated array (array C):\n"
        << C;
 
    Tarray D;
    D = B;
    std::cout
        << "\nCopied array (array D):\n"
        << D
        << "\nIf you want to sort your array in ascending order, enter 123."
        << "\nIf you want to sort your array in descending order, enter 321.\n";
    int user_choice;
    std::cin >> user_choice;
 
    std::cout << "\nSorted array:\n";
    if ( user_choice == 123 )
        D.ascending_sort();
    if ( user_choice == 321 )
        D.descending_sort();
    std::cout << D;
 
    Tarray S;
    S = B + C + D;
    std::cout
        << "\nSummarized array (arrays B + C + D):\n"
        << S
        << "\nSumm of all elements of the array: "
        << S.sum();
 
    tTarray Z( 7 );
    std::cout
        << "\n\nInherited array (array Z):\n"
        << Z;
 
    Z.reverse();
    std::cout
        << "\nInherited array after reversing (array Z):\n"
        << Z;
 
    Z.reset_if_is_not_multiple_of( number() );
    std::cout
        << "\nArray Z (inheritor) after selective resetting:\n"
        << Z;
}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.01.2017, 20:06
И вот ещё такой (добавил функцию-член push_back):
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
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>
 
class Tarray
{
private:
    unsigned int size_;
    int* arr;
 
public:
 
    enum { DEFAULT_SIZE = 7 };
 
    Tarray() : size_( DEFAULT_SIZE )
    {
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = 0;
    }
 
    Tarray( unsigned int sz ) : size_( sz )
    {
        std::srand( std::time( 0 ) );
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = std::rand() % 10;
    }
 
    Tarray( const Tarray& obj )
    {
        if ( this != &obj )
        {
            if ( size_ != obj.size() )
                this->resize( obj.size() );
 
            for ( unsigned int i = 0; i < size_; i++ )
                arr[i] = obj.arr[i];
        }
    }
 
    ~Tarray()
    {
        delete arr;
    }
 
    Tarray& operator=( const Tarray &obj )
    {
        if ( this != &obj )
        {
            if ( size_ != obj.size() )
                this->resize( obj.size() );
 
            for ( unsigned int i = 0; i < obj.size(); i++ )
                arr[i] = obj.arr[i];
        }
 
 
        return *this;
    }
 
    Tarray operator+( const Tarray &obj )
    {
        unsigned int size_of_largest_arr = 0;
        if ( size_ > obj.size() )
            size_of_largest_arr = size_;
        else
            size_of_largest_arr = obj.size();
 
        Tarray summ( size_of_largest_arr );
 
 
        for ( unsigned int i = 0; i < obj.size(); i++ )
            summ.arr[i] = arr[i] + obj.arr[i];
 
        return summ;
    }
 
    unsigned int size() const
    {
        return size_;
    }
 
    void resize( unsigned int sz )
    {
        delete arr;
        size_ = sz;
        std::srand( std::time( 0 ) );
        arr = new int[size_];
        for ( unsigned int i = 0; i < size_; i++ )
            arr[i] = std::rand() % 10;
    }
 
    void push_back( int new_elem )
    {
        Tarray temp( *this );
        this->resize( size_ + 1 );
        for ( unsigned int i = 0; i < temp.size(); i++ )
            arr[i] = temp.elem(i);
 
        arr[size_ - 1] = new_elem;
    }
 
    int elem( unsigned int index ) const
    {
        return arr[index];
    }
 
    void set_elem( unsigned int index, int value )
    {
        arr[index] = value;
    }
 
    int sum() const
    {
        int sum_of_elements = 0;
        for ( unsigned int i = 0; i < size_; i++ )
            sum_of_elements += arr[i];
 
        return sum_of_elements;
    }
 
    void ascending_sort()
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] > arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    void descending_sort()
    {
        int temp = 0;
        for ( unsigned int j = 1; j < size_; j++ )
        {
            for ( unsigned int i = 0; i < size_ - 1; i++ )
            {
                if ( arr[i] < arr[i + 1] )
                {
                    temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
        }
    }
 
    friend std::ostream& operator<<( std::ostream& os, const Tarray& obj )
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            os << obj.arr[i] << "\t";
        os << "\n";
        return os;
    }
 
    friend std::istream& operator>>( std::istream& is, Tarray& obj )
    {
        for ( unsigned int i = 0; i < obj.size(); i++ )
            is >> obj.arr[i];
 
        return is;
    }
};
 
struct tTarray : public Tarray
{
    tTarray() : Tarray()
    {}
 
    tTarray( unsigned int sz ) : Tarray( sz )
    {}
 
    void reverse()
    {
        int temp = 0;
        for ( unsigned int i = 0, j = size() - 1; i < size() / 2; i++, j-- )
        {
            temp = elem( i );
            set_elem( i, elem( j ) );
            set_elem( j , temp );
        }
    }
 
    void reset_if_is_not_multiple_of( int number )
    {
        for ( unsigned int i = 0; i < size(); i++ )
            if ( elem( i ) % number )
                set_elem( i, 0 );
    }
};
 
int number( std::string promt )
{
    std::cout << promt;
    int num = 0;
    std::cin >> num;
    return num;
}
 
int main()
{
    Tarray B;
    std::cout
        << "The elements of empty array:\n"
        << B
        << "\nEnter elements one by one:\n";
    std::cin >> B;
    std::cout
        << "\nOutput of the array that was entered (array B):\n"
        << B;
 
    Tarray C( number( "\nEnter a size of array C: " ) );
    std::cout
        << "\nGenerated array (array C):\n"
        << C;
 
    C.push_back( number( "\nEnter the value of new element of the array: " ) );
    std::cout
        << "\nNew version of the array C:\n"
        << C;
 
    Tarray D;
    D = B;
    std::cout
        << "\nCopied array (array D):\n"
        << D
        << "\nIf you want to sort your array in ascending order, enter 123."
        << "\nIf you want to sort your array in descending order, enter 321.\n";
    int user_choice;
    std::cin >> user_choice;
 
    std::cout << "\nSorted array:\n";
    if ( user_choice == 123 )
        D.ascending_sort();
    if ( user_choice == 321 )
        D.descending_sort();
    std::cout << D;
 
    Tarray S;
    S = B + C + D;
    std::cout
        << "\nSummarized array (arrays B + C + D):\n"
        << S
        << "\nSumm of all elements of the array: "
        << S.sum();
 
    tTarray Z( 7 );
    std::cout
        << "\n\nInherited array (array Z):\n"
        << Z;
 
    Z.reverse();
    std::cout
        << "\nInherited array after reversing (array Z):\n"
        << Z;
 
    Z.reset_if_is_not_multiple_of( number( "\nEnter an integer: " ) );
    std::cout
        << "\nArray Z (inheritor) after selective resetting:\n"
        << Z;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2017, 20:06

Не получается передать значение одного класса в другому классу
Добрый день не получается передать значение indi класса А в класс Anssingment Заранне благодарен! class Program { ...

Как передать контролы другому классу?
Думаю проще всего как мне обьект этой формы передать в след класс, в котором я буду работать с формой но как пример можно? а то все в 1...

Как передать объекты одного пользователя другому?
У меня есть два пользователя user1 и user2, не могу передать user2 права execute и select объектов пользовеля user1, в Object Privileges...

Не удается обратиться к другому классу из класса
class Foos { public function errosr($text) { print_r('ffff'); $this-&gt;error = &quot;&lt;span...

Наследование от protected класса: будут ли public члены класса Б доступны классу А
Добрый день! Если пронаследовать public класс А от protected класса Б, будут ли public члены класса Б доступны классу А, и доступны...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru