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

Не срабатывает конструктор копирования

27.04.2020, 14:15. Показов 1196. Ответов 7
Метки cpp (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, конструктор копирования выполняется, однако он не выполняет своих функций и программа вылетает. Что не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <time.h>
#include <cstring>
 
class peasant {
    char* name;
    double skill;
    double motivation;
    double W;
    double k1;
    double k2;
public:
    peasant(const char* name, double k1, double k2): name(NULL), motivation(1), skill(0.1 + (0.9 - 0.1) * rand() / RAND_MAX), W(0)
    {
        std::cout << "Construct 1 par";
        this->k1 = k1;
        this->k2 = k2;
        this->name = new char[(strlen(name))+1];
        strcpy(this->name, name);
    }
    peasant(const peasant &tmp) {
        std::cout << "constr copy\n";
        this->name = new char(strlen(tmp.name)+1);
        strcpy(this->name, tmp.name);
        this->skill = tmp.skill;
        this->motivation = tmp.motivation;
        this-> W = tmp.W;
        this-> k1 = tmp.k1;
        this-> k2 = tmp.k2;
        delete[] name;
    }
    void set_W(double w) { W = w; }
    void set_motivation(double M) { if (M <= 1)motivation = M; else motivation = 1; };
    void set_skill(double s) { if (s <= 1)skill = s; else skill = 1; }
    void set_k1(double k_t) { k1 = k_t; };
    void set_k2(double k_t) { k2 = k_t; };
   
    double get_W()const { return W; }
    double get_motivation()const { return motivation; }
    char* get_name()const { return name; }
    double get_skill()const { return skill; };
    double get_k1()const { return k1; };
    double get_k2()const { return k2; };
 
    void show_worker()const;
    ~peasant();
};
 
void peasant::show_worker()const {
    std::cout << "Name: " << get_name() << "\n";
    std::cout << "Skill: " << get_skill() << "\n";
    std::cout << "Motivation: " << get_motivation() << "\n";
    std::cout << "Production: " << get_W() << "\n";
}
peasant::~peasant() {
    delete[] name;
}
void show(peasant temp) {
    temp.show_worker();
}
int main()
{
    srand(time(NULL));
    short time = 8, weather;
    double k1 = 0.1 + (0.9 - 0.1) * rand() / RAND_MAX, k2(0.1 + (0.9 - 0.1) * rand() / RAND_MAX);
    char name[] = "Worker";
   
 
    peasant worker(name,k1,k2);
 
    //show(worker); - при ее вызове конструктор копирования срабатывает, потом возникает ошибка.
 
    return 0;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2020, 14:15
Ответы с готовыми решениями:

Почему не срабатывает конструктор копирования в пользовательском классе
вроде со всем разобралась, но не заходит в конструктор копирования. В чём ошибка? #include &lt;iostream&gt; #include...

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

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

7
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2020, 14:21
Зачем там delete?
0
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 227
27.04.2020, 14:22  [ТС]
nmcf, надо удалить, но ошибка не в этом.
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,688
27.04.2020, 15:31
d8veloper, разумеется падает и ошибка именно в delete[] - выделили память скопировали в неё строку, затем эту память освободили и пытаетесь обратиться по указателю на свежеосвобожденную память получая закономерный аксес виолейшен. Уберите делит, не гневите аллокатор почем зря
1
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 227
28.04.2020, 15:36  [ТС]
Annemesski, я и не спорю, что это ошибка, но если ее убрать - будет такой же вылет. Я нашел исконную ошибку, это strcpy. Если через for присваивать поэлементно значения, то все работает.

Добавлено через 4 минуты
Annemesski, я delete всунул когда наугад искал ошибку, а потом забыл удалить. Его и не должно было быть.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.04.2020, 15:38
Цитата Сообщение от d8veloper Посмотреть сообщение
это strcpy
А может круглые скобки, которые ты вместо квадратных используешь в new?
0
 Аватар для Annemesski
2673 / 1335 / 480
Регистрация: 08.11.2016
Сообщений: 3,688
28.04.2020, 15:46
Лучший ответ Сообщение было отмечено d8veloper как решение

Решение

d8veloper, а если сделать по хорошему, то есть чтобы имена параметров передаваемых методам класса (в том числе и конструкторам) не совпадали, как Вам такая идея?

Добавлено через 4 минуты
и еще, по хорошему бы определить конструктор по умолчанию и список инициализации из конструктора с параметрами перенести туда и уж если так хочется - вызвать конструктор по умолчанию в списке инициализации конструктора с параметрами
1
0 / 0 / 0
Регистрация: 17.11.2019
Сообщений: 227
28.04.2020, 20:42  [ТС]
Цитата Сообщение от Annemesski Посмотреть сообщение
а если сделать по хорошему, то есть чтобы имена параметров передаваемых методам класса (в том числе и конструкторам) не совпадали, как Вам такая идея?
гениальная идея, уже стараюсь так и делать. Остальное же (
Цитата Сообщение от Annemesski Посмотреть сообщение
и еще, по хорошему бы определить конструктор по умолчанию и список инициализации из конструктора с параметрами перенести туда и уж если так хочется - вызвать конструктор по умолчанию в списке инициализации конструктора с параметрами
) преподу не надо...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.04.2020, 20:42
Помогаю со студенческими работами здесь

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

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

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

Конструктор копирования
Приветствую! Есть следующий пример: #include &lt;iostream&gt; using namespace std; class Alpha{ private: int data; public: ...

Конструктор копирования
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; #define SIZE 30 using namespace std; class Spivak { char...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru