С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 51

Реализация конструктора

27.12.2017, 19:30. Показов 4426. Ответов 9
Метки нет (Все метки)

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

Подскажите пожалуйста как реализовать создание конструктора с функцией создания массивов, с условиями что:

1) Длина массива вводится в консоли;
2) Элементы массива вводятся в консоли;
3) По условию задачи нужно задать два массива.

Заранее благодарю за помощь.

Моя реализация:
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
#include <conio.h>
#include <stdio.h>
#include <string>
#include <stdlib.h>
 
class Set
{   
    public:
        // Открытые переменные
        
        int mass_length1;
        int *mass_elements1;
        int mass_length2;
        int *mass_elements2;
        int mass_length3;
        int *mass_elements3;
        int **mass_elements4;
        int *mass_elements5;
        
 
        // Конструктор Set для создания массивов
        Set::Set (int n = 0, int mass_length, int mass_elements)
        {
            // Вводим количество элементов первого массива           
            std::cout << " Введите количество элементов массива ", n, ": "; 
            std::cin >> mass_length;
            
            // Выделяем память для массива
            mass_elements = new int[mass_length];
 
            // Вводим элементы массива
            for(int e = 0; e < mass_length; e++)
            {
            std::cout << " Введите элемент массива: ", e + 1;
            std::cin >> mass_elements[e];
            }
        }
 
        ~Set()
        {   
        // Удаление все созданных элементов
            delete [] mass_elements1;
            delete [] mass_elements2;
        
        }                   
};
 
int main(int argc, char** argv)
{
 
Set mass1(int n = 1, int mass_length1, int mass_elements1);
Set mass2(int n = 2, int mass_length2, int mass_elements2);
 
 
system("pause");
return 0;
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2017, 19:30
Ответы с готовыми решениями:

Реализация перегруженного конструктора
Друзья, помоги с перегрузкой конструктора. Вообще задач от программы, что бы можно было задавать месяц такого вида 28.01.1994 и...

Реализация конструктора класса
Здравствуйте! Хотел задать такой вопрос: Предположим, имеется класс: class Object { private: int itsVal1; int...

Реализация конструктора копирования и перегрузки =
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class Cow{ private: char name; char *...

9
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
27.12.2017, 21:44
Лучший ответ Сообщение было отмечено Anatoliy_84 как решение

Решение

Методы доступа к содержимому массива взамен arrray.data пилите сами.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class MyVector
{
public:
    MyVector(std::size_t size):data(new int[size]){}
    ~MyVector(){delete[] data;}
    int*data;
};
 
int main()
{
    std::size_t size;
    std::cin>>size;
    MyVector array1(size);
    for(std::size_t i=0;i<size;++i)
        std::cin>>array1.data[i];
 
    std::cin>>size;
    MyVector array2(size);
    for(std::size_t i=0;i<size;++i)
        std::cin>>array2.data[i];
    return 0;
}
1
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 51
28.12.2017, 16:03  [ТС]
Renji, скажите, это единственная возможная реализация?
Смысл моего задания создать конструктор с помощью которого можно создать элементы (в моем случае массивы) а их количество уже задавать в методе main ссылаясь на конструктор... И далее реализовывать перегрузки функций. В любом случае спасибо за ответ!
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.12.2017, 16:17
Цитата Сообщение от Anatoliy_84 Посмотреть сообщение
Смысл моего задания создать конструктор с помощью которого можно создать элементы (в моем случае массивы) а их количество уже задавать в методе main ссылаясь на конструктор...
Так конструктор и создает элементы (типа int). Как задание звучит в оригинале, а не в вашем пересказе? Я на 90% уверен что вы в нем чего-то недопоняли и речь шла о том что:
1) Создать конструктор объекта "массив с задаваемым в консоли количеством элементов".
2) Создать два таких объекта.

Если же нужен именно массив массивов, то создаете рядышком класс Vector2D который выглядит прям как MyVector, только вместо int там MyVector. Если нужен массив массивов массивов - создаете класс Vector3D который выглядит прям как... ну вы поняли (правильней все это загнать в один шаблон, но вы их наверно еще не проходили).
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 51
28.12.2017, 17:29  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Так конструктор и создает элементы (типа int). Как задание звучит в оригинале, а не в вашем пересказе? Я на 90% уверен что вы в нем чего-то недопоняли и речь шла о том что:
Это серия лабораторных работ из трех заданий:

1) Тема Реализация класса. Класс Set — множество имеет поля — указатель на массив, размер массива. Конструктор класса по заданному значению k выделяет память под k элементов и заполняет их, считывая значения элементов с клавиатуры. Реализуйте методы, вычисляющие пересечение, объединение и разность двух заданных объектов класса Set.

2) Тема Конструкторы деструкторы. Для классов, написанных в лабораторной работе No1, допишите еще один конструктор и деструктор.

3) Тема Перегрузка операторов. Операторы + (объединение), * (пересечение), (разность) двух множеств.

С первыми двумя я справился, правда формально т.к. во втором задании я создавал оба массива в теле одного конструктора, поэтому у меня получался один объект в теле main, соответственно посчитать объединение уже не получится т.к. объект один.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.12.2017, 20:02
Цитата Сообщение от Anatoliy_84 Посмотреть сообщение
2) Тема Конструкторы деструкторы. Для классов, написанных в лабораторной работе No1, допишите еще один конструктор и деструктор.
Это уже ерунда какая-то. Как можно дописать "еще один" деструктор, если он в классе может быть только один? Или имеется ввиду что в работе No1 можно без деструктора, но вот к работе No2 его сделайте?
Цитата Сообщение от Anatoliy_84 Посмотреть сообщение
1) Тема Реализация класса. Класс Set — множество имеет поля — указатель на массив, размер массива.
Ну ага, класс поле data указывающее на массив. Нигде не написано массив чего именно, так что это может быть и массив int как у меня.
0
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 51
24.01.2018, 16:28  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Нигде не написано массив чего именно, так что это может быть и массив int как у меня.
Спасибо Вам за предложениее по реализации и внимание к моей работе.

Поставленную задачу я сделал по своему. Однако, продолжив работу по заданию, а именно реализацию перегрузок функций уперся в непонятное поведение компилятора. Сечас, прошу Вас посмотреть мою реализацию объединения двух массивов. Из непонятного, интересует почему появляется запрос на ввод элементов для третьего массива, который должен быть массивом объединения массива1 и массива2.

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
#include <iostream> /* Подключение стандартной библиотеки */
#include <conio.h> /* Подключение библиотеки ввода, вывода */
#include <stdio.h>
#include <string>
#include <stdlib.h>
 
class Set
{   
    public:
        // Открытые переменные
        int mass_length;
        int mass_length3; 
        int *mass_elements; 
        int *mass_elements3;
        // конструктор Set для создания массивов
        Set()
        {           
            // вводим количество элементов массива          
            std::cout << " Введите количество эллементов массива "; 
            std::cin >> mass_length;
            
            // выделяем память для массива1
            mass_elements = new int[mass_length];
            // вводим элементы с клавиатуры
            for (int e = 0; e < mass_length; e++)
            {        
                std::cout << " Введите эллемент массива: ", e + 1;
                std::cin >> mass_elements[e];
            }
            // выводим на экран эллементы первого массива
            std::cout << "\n Массив: ";
            for (int e = 0; e < mass_length; e++)
            {
                std::cout << " [ " << mass_elements[e] << " ]";
            }
            std::cout << "\n";
        }
        
        Set operator + (Set mass2)
        {   
            
            int mass_length3 = this->mass_length + mass2.mass_length;
            // выделяем память для массива3
            mass_elements3 = new int[mass_length3];
            for (int i = 0; i < mass_length3; i++)
                               {
                if (i < this->mass_length) {
                    mass_elements3[i] = this->mass_elements[i];
                }
                else 
                {
                    mass_elements3[i] = mass2.mass_elements[i - this->mass_length];
                }
            }
            // перегрузка оператора + (объединение двух массивов)
            for (int i = 0; i < mass_length3; i++)
            {
                for (int n = i + 1; n < mass_length3; n++)
                {
                    if (mass_elements3[i] == mass_elements3[n])
                    {
                        for (int f = n; f < mass_length3 -1; f++)
                        {
                            mass_elements3[f] = mass_elements3[f + 1];
                        }
                        
                        mass_length3 -= 1; 
                        
                        if (mass_elements3[i] == mass_elements3[n])
                        { 
                            n--;      
                        }
                    }
                }
            }
            
            std::cout << "\n Объединение двух массивов: ";
            for (int e = 0; e < mass_length; e++)
            {
                std::cout << " [ " << mass_elements[e] << " ]";
            }
            std::cout << "\n";          
        }
        
        ~Set()
        {   
            // Деструктор удаляет все элементы созданные в конструкторе Set
            delete [] mass_elements;
            delete [] mass_elements3;
        }                   
};
 
int main(int argc, char** argv)
{
    Set mass1;
    Set mass2;
    Set association;
    association = mass1 + mass2;
    system("pause");
    return 0;
};
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.01.2018, 17:08
Цитата Сообщение от Anatoliy_84 Посмотреть сообщение
почему появляется запрос на ввод элементов для третьего массива
Потому что конструктор без параметров так написан
Разделять надо такие вещи. Хотя в задании требуют иное - печально, что сразу учат неправильно.

Далее, оператор+ почему-то ничего не возвращает. Это надо поправить.
Далее, во втором задании предлагалось написать "еще один конструктор", его не видно в представленном коде. Учитывая, что конструктор без параметров вместе с оператором присваивания (как попытались в коде выше) использовать не получится, а следующая тема - перегрузка операторов, то "еще один конструктор" - это конструктор копирования. Без него выполнить задание правильно не получится.

Я думаю, фронт работ понятен?
1
0 / 0 / 0
Регистрация: 24.11.2017
Сообщений: 51
24.01.2018, 19:02  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Я думаю, фронт работ понятен?
В общик чертах, попробую разобраться. Спасибо!

Добавлено через 1 час 41 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Я думаю, фронт работ понятен?
Внес пару изменений, прога работает как нужно, но после выполнения возникает ошибка, не подскажите из-за чего?

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
#include <iostream> /* Подключение стандартной библиотеки */
#include <conio.h> /* Подключение библиотеки ввода, вывода */
#include <stdio.h>
#include <string>
#include <stdlib.h>
 
class Set
{   
    public:
        // Открытые переменные
        int mass_length;
        int mass_length3; 
        int *mass_elements; 
        int *mass_elements3;
        // конструктор Set для создания массивов
        Set()
        {           
            // вводим количество элементов массива          
            std::cout << " Введите количество эллементов массива "; 
            std::cin >> mass_length;
            
            // выделяем память для массива1
            mass_elements = new int[mass_length];
            // вводим элементы с клавиатуры
            for (int e = 0; e < mass_length; e++)
            {        
                std::cout << " Введите эллемент массива: ", e + 1;
                std::cin >> mass_elements[e];
            }
            // выводим на экран эллементы первого массива
            std::cout << "\n Массив: ";
            for (int e = 0; e < mass_length; e++)
            {
                std::cout << " [ " << mass_elements[e] << " ]";
            }
            std::cout << "\n";
        }
        
        Set operator + (Set mass2) // перегрузка оператора + (объединение двух массивов)
        {   
            mass_length3 = this->mass_length + mass2.mass_length;
            // выделяем память под массив3
            mass_elements3 = new int[mass_length3];
            for (int i = 0; i < mass_length3; i++)
            {
                if (i < this->mass_length)
                {
                    mass_elements3[i] = this->mass_elements[i];
                }
                else 
                {
                    mass_elements3[i] = mass2.mass_elements[i - this->mass_length];
                }
            }
            
            for (int i = 0; i < mass_length3; i++)
            {
                for (int n = i + 1; n < mass_length3; n++)
                {
                    if (mass_elements3[i] == mass_elements3[n])
                    {
                        for (int f = n; f < mass_length3 -1; f++)
                        {
                            mass_elements3[f] = mass_elements3[f + 1];
                        }
                        
                        mass_length3 -= 1; 
                        
                        if (mass_elements3[i] == mass_elements3[n])
                        { 
                            n--;      
                        }
                    }
                }
            }
            
            std::cout << "\n Объединение двух массивов: ";
            for (int e = 0; e < mass_length3; e++)
            {
                std::cout << " [ " << mass_elements3[e] << " ]";
            }
            std::cout << "\n";  
        }
        
        ~Set()
        {   
            // Деструктор удаляет все элементы созданные в конструкторе Set
            delete [] mass_elements;
            delete [] mass_elements3;   
        }                   
};
 
int main(int argc, char** argv)
{   
    Set mass1;
    Set mass2;
 
    Set association = mass1 + mass2;
    
    system("pause");
    return 0;
};
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
24.01.2018, 19:31
Цитата Сообщение от Anatoliy_84 Посмотреть сообщение
Внес пару изменений
Так ничего из того, о чем выше говорилось не было сделано.
Конструктор копирования - не написан.
operator+ по прежнему не возвращает значения (отсутствует return), что есть UB.

В общем-то ошибка типичная, разобрана, например, здесь. Там есть даже пример, который решает ровно ту же задачу, что и здесь (только правильно работающий).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2018, 19:31
Помогаю со студенческими работами здесь

Реализация конструктора копирования для класса
P.S плохо с русским Этот конструктор копирования сломал мне мозг И вот что я понемаю когда мы делаем так foo objCopy(obj); ...

Реализация конструктора копирования для двумерного динамического массива
Практически реализовал, не понимаю, почему не получается... #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; ...

Как понять, что реализация конструктора в классе произошла?
VISUAL C++ Как понять что реализация конструктора в классе произошла ?

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

Реализация конструктора по умолчанию
Добрый день. Помогите разобраться с теорией. В книге говорится, что для каждого класса в программе компилятор создает конструктор по...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru