Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
CHELOVEKPAUK
13 / 3 / 2
Регистрация: 01.08.2013
Сообщений: 332
Записей в блоге: 1
#1

Перегрузка оператора присваивания - C++

13.02.2014, 22:07. Просмотров 473. Ответов 2
Метки нет (Все метки)

Задание простое: по заданному классу составить простую программу с использованием динамической памяти.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Cow
{
    char name[20];
    char* chobby;
    double weight;
public:
    Cow();
    Cow(const char* nm, const char* ho, double wt);
    Cow(const Cow & c);
    ~Cow();
    Cow & operator=(const Cow & c);
    void ShowCow() const;
};
1 файл:
Кликните здесь для просмотра всего текста
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
#include "h.h"
 
Cow::Cow()
{
    cout << "Вызван конструктор" << endl;
    chobby = NULL;
    weight = 0;
}
 
Cow::Cow(const char* nm, const char* ho, double wt)
{
    cout << "Вызван конструктор" << endl;
    strncpy(name,nm,20);
    chobby = new char[strlen(ho)+1];
    strcpy(chobby,ho);
    weight = wt;
}
 
Cow::Cow(const Cow & c)
{
    cout << "Вызван конструктор" << endl;
    strncpy(name,c.name,20);
    chobby = new char[strlen(c.chobby)+1];
    strcpy(chobby,c.chobby);
    weight = c.weight;
}
 
Cow::~Cow()
{
    cout << "Вызван деструктор:" << endl;
    delete [] chobby;
}
 
Cow & Cow::operator=(const Cow & c)
{
    cout << "Вызвана операция присваивания" << endl;
    if (&c == this)
        return *this;
    delete [] chobby;
    strncpy(name,c.name,20);
    chobby = new char[strlen(c.chobby)+1];
    strcpy(chobby,c.chobby);
    return *this;
}
 
void Cow::ShowCow() const
{
    cout << "name: " << name << endl;
    cout << "chobby: " << chobby << endl;
    cout << "weight: " << weight << endl;
}

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
#include <iostream>
#include <Windows.h>
#include "h.h"
 
using namespace std;
 
#define rus setlocale(0,"rus");SetConsoleCP(1251);SetConsoleOutputCP(1251);
 
int main()
{
    rus;
    cout << "Obj1:\n";
    Cow* Obj1 = new Cow;
    cout << "Obj2:\n";
    Cow* Obj2 = new Cow("ABC","DEF",582.1);
    cout << "Obj3:\n";
    Cow* Obj3 = new Cow(*Obj2);
    cout << "Obj4:\n";
    Cow* Obj4 = Obj1;
 
    Obj1->ShowCow();
    Obj2->ShowCow();
    Obj3->ShowCow();
    Obj4->ShowCow();
 
    Obj1->~Cow();
    Obj2->~Cow();
    Obj3->~Cow();
    Obj4->~Cow();
}


Объясните пожалуйста, в чем ошибка, на вызове Cow* Obj4 = Obj1; вылетает с необработанным исключением. Загвоздка где то в операции присваивания.

Вот, что пишет после прогона:

C++
1
2
3
4
5
6
7
8
9
Obj1:
Вызван конструктор
Obj2:
Вызван конструктор
Obj3:
Вызван конструктор
Obj4:
name: НННННННННННННННННННН
chobby:
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 22:07     Перегрузка оператора присваивания
Посмотрите здесь:

C++ Перегрузка оператора присваивания
Перегрузка оператора индексации и присваивания (C++) C++
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
C++ Перегрузка оператора присваивания
Конструктор копирования и перегрузка оператора присваивания C++
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания и двухмерный массив C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.02.2014, 22:39     Перегрузка оператора присваивания #2
Деструкторы вручную не вызывают.
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Cow* Obj4 = Obj1;
Два указателя на один объект.
Цитата Сообщение от CHELOVEKPAUK Посмотреть сообщение
Obj1->~Cow();
...
Obj4->~Cow();
Двойное освобождение памяти.

Добавлено через 20 минут
Как-то так:
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
...
Cow::Cow()
{
    cout << "Вызван конструктор" << endl;
    name[0] = '\0';
    chobby = new char[1];
    chobby[0] = '\0';
    weight = 0;
}
...
int main()
{
    rus;
    cout << "Obj1:\n";
    Cow* Obj1 = new Cow;
    cout << "Obj2:\n";
    Cow* Obj2 = new Cow("ABC","DEF",582.1);
    cout << "Obj3:\n";
    Cow* Obj3 = new Cow(*Obj2);
    cout << "Obj4:\n";
    Cow* Obj4 = new Cow;
    *Obj4 = *Obj2;
 
    Obj1->ShowCow();
    Obj2->ShowCow();
    Obj3->ShowCow();
    Obj4->ShowCow();
 
    delete Obj1;
    delete Obj2;
    delete Obj3;
    delete Obj4;
    
    cin.get();
    return 0;
 
}
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 22:52     Перегрузка оператора присваивания #3
вы тут оперируете указателями. operator = для вашего класса нигде не вызывается.
если смотреть на трейсы - то все плохо становится после строки 18.
видим, что выводится какой-то объект. очевидно что это Obj1.
смотрим на строку 13 и видим что он конструируется конструктором без параметров.
так же из трейса видно, что все плохо стало после печати "chobby:"
т.е. отвалилось в строке 49. и все это наверно потому, что мембер chobby указывает на ноль
(смотри конструктор без параметров)

А вообще осваивайте средства отладки своей IDE
Yandex
Объявления
13.02.2014, 22:52     Перегрузка оператора присваивания
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru