Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

13.02.2014, 22:07. Просмотров 530. Ответов 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:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2014, 22:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора присваивания (C++):

Перегрузка оператора присваивания - C++
Доброго времени суток! Возник вопрос по поводу перегрузки оператора присваивания. Пример перегрузки по канону: class Integer { ...

Перегрузка оператора присваивания - C++
мне надо было реализовать конструкторы, деструктор, оператор присваивания, функции ввода / вывода объектов; кто сможет дописать...

Перегрузка оператора присваивания - C++
MyArray&amp; operator=( MyArray &amp;arrInt2 ) //Зачем писать MyArray&amp; operator?А почему не MyArray operator ? { delete ...

Перегрузка оператора присваивания - C++
Доброго времени суток всем! Никак не могу правильно написать перегрузку оператора присваивания. При создании одного нового элемента...

Перегрузка оператора присваивания - C++
При перегрузке оператора присвоения выдает ошибки cpp(58) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider...

Перегрузка оператора присваивания - C++
Приветствую всех. Не могли бы подсказать как переопределить оператор присваивания. То что искал, так там написано в общем о...

2
alsav22
5426 / 4821 / 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;
 
}
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.02.2014, 22:52 #3
вы тут оперируете указателями. operator = для вашего класса нигде не вызывается.
если смотреть на трейсы - то все плохо становится после строки 18.
видим, что выводится какой-то объект. очевидно что это Obj1.
смотрим на строку 13 и видим что он конструируется конструктором без параметров.
так же из трейса видно, что все плохо стало после печати "chobby:"
т.е. отвалилось в строке 49. и все это наверно потому, что мембер chobby указывает на ноль
(смотри конструктор без параметров)

А вообще осваивайте средства отладки своей IDE
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2014, 22:52
Привет! Вот еще темы с ответами:

Перегрузка оператора присваивания - C++
Добрый вечер. Есть задание: Нужно так перегрузить оператор =, чтобы можно было элементу одного класса, присваивать значение элемента...

Перегрузка оператора присваивания - C++
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по примеру из книги Шилдта С++ Базовый курс....

Перегрузка оператора присваивания - C++
Вот есть такой класс template&lt;typename TT&gt; class Matrix { public: ...

Перегрузка оператора присваивания в строке - C++
Всем привет, задание в вузе дали, пытаюсь понять правильно ли я сделал его Ввести с клавиатуры строку  символов . Признак окончания...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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