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

Вставить конструктор копирования в программу

24.02.2015, 20:38. Показов 675. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Составить описание класса одномерных массивов строк, каждая строка задается длиной и указателем на выделенную для нее память. Предусмотреть возможность обращения к отдельным строкам массива по индексам, контроль выхода за пределы массивов, выполнения операций поэлементного сцепления двух массивов с образованием нового массива, слияния двух массивов с исключением повторяющихся элементов, вывод на экран элемента массива и всего массива. Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
Программа работает, помогите вставить конструктор копирования пожлауйста
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
#include <iostream>
#include <iomanip> 
 
 
using namespace std;
class ZAD3
{
 int *a,*d,n,min;
 
 
 public: void sozdat();
 public: void Vvod_RANDOM();
 void SCEPLENIE(int n1, int n2);
 void SLIANIE(int n3, int n4);
 void VIVOD();
 void INDVIVOD(int number);
 void POISK(int rec, int field);
};
void ZAD3 :: sozdat() //Создание массива строк
{
     d=(int*)malloc(sizeof(int)*n);
int m=1;
 cout<<"Количество строк=";cin>>n;
 int min=0;
 for (int i=0;i<n;i++)
 {
 cout<<"Количество элементов "<< i+1 <<" в строке= ";
 cin>>m;
 
 
 *(d+i)=m;
 if (min<m) min=m;
  a=(int*)malloc(sizeof(int)*n*min*m);
 }
 
 a=(int*)malloc(sizeof(int)*n*min*m); //выделение памяти 
}
void ZAD3::Vvod_RANDOM()// Ввод случайных чисел в массив строк 
{
 sozdat();
 for(int i=0;i<n;i++)
 for (int j=0; j<*(d+i); j++)
 {
 *(a+i+j)=rand()%100;
 }
}
void ZAD3 :: VIVOD()//Ввывод всех строк
{
 for(int i=0;i<n;i++)
 {
 for (int j=0; j<*(d+i);j++)
 {
 cout<<setw(6)<<*(a+i+j);
 }
 cout<<endl;
 }
}
void ZAD3 :: INDVIVOD(int number)//Ввывод строк по индексу
{
 for(int i=0;i<n;i++)
 {
 for (int j=0; j<*(d+i);j++)
 {
 if (i==number) cout<<setw(6)<<*(a+i+j);
 }
 cout<<endl;
 }
}
 
void ZAD3 :: POISK(int rec, int field)//Ввывод конкретного элемента конкретной строки (rec – номер строки выводимого массива, field – номер элемента в строке)
{
 for(int i=0;i<n;i++)
 {
 for (int j=0; j<*(d+i);j++)
 {
 if ((i==rec)&&(j==field)) cout<<"Даный элемент= "<<setw(6)<<*(a+i+j);
 else "Массив с такими даннымы не найден!";
 }
 cout<<endl;
 }
}
void ZAD3 :: SCEPLENIE(int n1,int n2)//Сцепление двух массивов. Значениям дополнительных переменных m1 и m2 присваиваются длины строк, которые необходимо сцепить. Их сумма есть длина нового массива.
{
 int m1,m2,k,j,l,p;
 int c[20];
 m1=*(d+n1);
 m2=*(d+n2);
 int m3=m1+m2;
 k=0;
 for (l=0;l<m3;l++)
 if(l<m1)
 {c[l]=*(a+n1+l);
 cout<<setw(6)<<c[l];
 }
 else if((l>=m1)&&(l<m3))
 {
 c[l]=*(a+n2+k);
 cout<<setw(6)<<c[l];
 k++;
 }
}
void ZAD3 :: SLIANIE(int n3,int n4)//Слияние двух массивов
{
 int m1,m2,k,j,l,p,l1;
 int c[20],f[20];
 m1=*(d+n3);
 m2=*(d+n4);
 int m3=m1+m2;
 k=0;
 for (l=0;l<m3;l++)
 {
 if(l<m1)
 {c[l]=*(a+n3+l);
 }
 else if((l>=m1)&&(l<m3))
 {
 c[l]=*(a+n4+k);
 k++;
 }
 }
 l1=0;
 f[l1]=c[l1];
 cout<<setw(6)<<f[l1];
 for(p=1;p<m3;p++)
 if(f[l1]!=c[p])
 { l++;
 f[l1]=c[p];
 cout<<setw(6)<<f[l1];
 }
}
void main()
{
setlocale(LC_ALL,"Russian");
 ZAD3 a,b;
 int number,punkt,rec,field,kol,n1,n2,n,n3,n4;
  cout<<"1 - Создание массива ";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;
 while (punkt!=7) //Меню
 {
 switch(punkt)
 {
 case 1: {
 a.Vvod_RANDOM();
 cout<<endl;
 a.VIVOD();
 cout<<endl;
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;
 }
 break;
 case 2: {
 a.VIVOD();
 cout<<endl;
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt; }
 break;
 case 3: {
 cout<<"Введите номер массива (нумерация начинаеться с 0!): ";cin>>number;
 cout<<endl;
 a.INDVIVOD(number);
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;
 }
 break;
 case 4: {
 cout<<"Введите номер 1-го массива : ";cin>>n1;cout<<endl;
 cout<<"Введите номер 2-го массива: ";cin>>n2;cout<<endl;
 a.SCEPLENIE(n1,n2);
 cout<<endl;
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;}
 break;
 case 5: {
 cout<<"Введите номер 1-го массива: ";cin>>n3;cout<<endl;
 cout<<"Введите номер 1-го массива: ";cin>>n4;cout<<endl;
 a.SLIANIE(n3,n4);
 cout<<endl;
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;}
 break;
 
 case 6: {
 cout<<"Введите номер строки массива: ";cin>>rec;
 cout<<endl;
 cout<<"Введите номер столбца: ";cin>>field;
 cout<<endl;
 a.POISK(rec,field);
 cout<<"1 - Создание массива";cout<<endl;
 cout<<"2 - Вывод всех строк";cout<<endl;
 cout<<"3 - Вывод строки по индексу";cout<<endl;
 cout<<"4 - Сцепление двух массивов";cout<<endl;
 cout<<"5 - Слияние двух масивов";cout<<endl;
 cout<<"6 - Вывод конкретного элемента конкретной строки";cout<<endl;
 cout<<"7 - Выход";cout<<endl;
 cout<<"Выберете пункт в меню: "; cin>> punkt;}
 break;
 case 7:
 break;
 }
 }
 }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2015, 20:38
Ответы с готовыми решениями:

Добавить в программу конструктор копирования
Задача состоит в следующем : нужно добавить в программу конструктор копирования. Искал на многих...

Добавить конструктор копирования в программу
Здравствуйте! Знаю, что разбираться в чужом коде дело очень веселое, но нужна помощь с добавлением...

Подскажите пожалуйста как добавить конструктор копирования в готовую программу
Вот код программы: # include &lt;iostream&gt; # include &lt;conio.h&gt; # include &lt;string&gt; # include...

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...

10
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.02.2015, 21:55 2
Это вообще работает? Где там строки? Для чего нужны a и d?
0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
24.02.2015, 21:59 3
Как-то так:
C++
1
2
3
4
5
6
7
ZAD3(const ZAD3& a){
//int *a,*d,n,min;
   this->n = a.n;
   this->min = a.min;
   this->a = new int(*(a.a));
   this->d = new int(*(a.d));
}
0
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
25.02.2015, 01:11 4
otmenno74, ты наворотил конечно))) а зачем в С++ умные люди предусмотрели конструкторы с параметрами и перегрузку операторов?))) Например оператора [], с помощью которого ты мог бы осуществить адресное обращение к элементам массива

Добавлено через 1 минуту
Цитата Сообщение от MakeEasy Посмотреть сообщение
C++
1
2
this->a = new int(*(a.a));
this->d = new int(*(a.d));
что это? даже несмотря на бессмысленность этих операций, тут идёт обращение к закрытым полям экземпляра класса, передаваемого по ссылке в качестве аргумента

Добавлено через 10 минут
Вот разбирайся с кодом, быстренько накидал. Нет проверки существования конструктора по умолчания для типа Т, так же как и оператора присваивания для этого же типа. Пользуйся встроенными пока что)
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
template <typename T>
class Array
{
public:
    //   конструктор класса, который создает
    //   Array размера size, заполненный значениями
    //   value типа T
    explicit Array(size_t size = 0, const T& value = T()) : size_(size), data_(new T[size]) //инициализация полей
    {
        for (size_t i = 0; i < size; ++i) // заполнение массива значениями value типа T
            data_[i] = value;
    }
    //   конструктор копирования, который создает
    //   копию параметра.
    Array(const Array & a) : size_(a.size()), data_(new T[size_]) // выделение памяти под новый массив
    {
        for (size_t i = 0; i < size_; ++i) // копирование значений, расположенных в массиве, во вновь созданный массив
            this->data_[i] = a.data_[i];
    }
    //   деструктор
    ~Array()
    {
        delete[] data_; освобождаем выделенную память
    }
    //   оператор присваивания.
    Array & operator=(const Array & a)
    {
        if (this != &a) // проверка попытки присвоить массив самому себе, если нет, то удаляем старый
        {
            delete[] this->data_;
            this->size_ = a.size();
            this->data_ = new T[size_];
            for (size_t i = 0; i < size_; ++i)
                this->data_[i] = a.data_[i];
        }
        return *this; 
    }
    // геттер неконстантного массива
    size_t size()
    {
        return size_;
    }
    // геттер размера константного массива
    size_t size() const
    {
        return size_;
    }
    // переопределение оператора [] для обращения по индексу
    T& operator[](size_t i)
    {
        return data_[i];
    }
    // ещё одна версия оператора доступа по индексу, для константных массивов
    const T& operator[](size_t i) const
    {
        return data_[i];
    }
private:
    size_t size_;
    T * data_;
};
Добавлено через 3 минуты
Пример создания экземпляра такого класса:
C++
1
2
Array<int> a1(10, 0); // массив из 10 элементов целого типа, заполненный нулями
Array<double> a2(5, 3.1415); // массив из 5 элементов вещественного типа двойной точности, заполненный числами пи
0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
25.02.2015, 18:03 5
Цитата Сообщение от GREGOR_812 Посмотреть сообщение
что это? даже несмотря на бессмысленность этих операций, тут идёт обращение к закрытым полям экземпляра класса, передаваемого по ссылке в качестве аргумента
Это конструктор копирования с "deep copy". Метод класса имеет доступ к своим приватным полям. "Своим" это значит класс, а не конкретный объект.
0
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
25.02.2015, 21:44 6
Цитата Сообщение от MakeEasy Посмотреть сообщение
Это конструктор копирования с "deep copy"
поясни смысл конструкции. Я вижу тут только копирование числа, на которое указывает int * a и т.д. Он может указывать на массив
0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
25.02.2015, 22:06 7
Цитата Сообщение от GREGOR_812 Посмотреть сообщение
поясни смысл конструкции. Я вижу тут только копирование числа, на которое указывает int * a и т.д. Он может указывать на массив
Да, int *a это в данном коде массив. Я посмотрел только первые 20 строчек кода. Кинул пример конструктора копирования. Понятно, что если это массив, то копировать надо весь кусок памяти. Deep copy это глубокое копирование(если кратко, это копирование данных указателя, а не самого указателя).
0
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
25.02.2015, 22:24 8
MakeEasy, я знаю, что такое глубокое копирование, просто твой конструктор копирования его не особенно глубоко реализует) только первый элемент, и тот, по-моему, недоступен будет. Поэтому меня это и насторожило. Я не гуру С++, поэтому сейчас попробую скомпилировать такую конструкцию, что-то меня сомнения берут

Добавлено через 14 минут
Собрал программу. Во-первых, раз уж ты хочешь переопределить конструктор копирования, то нужно переопределить конструктор по умолчанию и оператор присваивания. Во-вторых, код - это просто ад. Зачем 10 раз писать одни и те же куски? Кто вас так учит писать код? Неужели самому не видно, что это переизбыток, каша, которую невозможно разбирать. Проектируй программу, потом пиши код
0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
25.02.2015, 22:25 9
int *a это указатель на один инт, как char* указатель на один char. В чем проблема? Когда я писал тот кусочек кода, я не знал что этот указатель используется как массив. По этому предположил что это просто указатель на один инт.
Цитата Сообщение от GREGOR_812 Посмотреть сообщение
по-моему, недоступен будет
Я не совсем понимаю, почему он должен быть недоступен.

C++
1
2
this->a = new int(*(a.a));
this->d = new int(*(a.d));
Замени эти строчки на свой вариант. Как правильно скопировать указатель с даннным?
0
28 / 28 / 5
Регистрация: 23.04.2014
Сообщений: 130
25.02.2015, 22:33 10
MakeEasy, да, действительно, был неправ) конструктор копирования работает на отлично, за исключением того, что копирует только первые значения массивов
0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
25.02.2015, 22:39 11
Да ничего, я тоже ошибся). Не увидел что указатель используется как массив.
0
25.02.2015, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2015, 22:39
Помогаю со студенческими работами здесь

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act =...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...


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

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