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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.88
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
#1

Как передалеть operator= класса? - C++

20.01.2010, 14:16. Просмотров 5025. Ответов 78
Метки нет (Все метки)

Вот готовая программа, но там одна проблема - после использования оператора=, при изменении значений в одном объекте класса, они изменяются и в другом. Другими словами, как сделать так, чтобы вывод программы был:

Frisky's age: 5
whisker's age: 6

а не

Frisky's age: 5
whisker's age: 0

Вот код программы:

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
#include <iostream>
using namespace std;
 
class CAT
{
    public:
        CAT();
        ~CAT();
        
        int GetAge() const { return *itsAge; }
        int GetWeight() const { return *itsWeight; }
        void SetAge(int age) { *itsAge = age; }
        CAT& operator=(const CAT&);
    
    private:
        int* itsAge;
        int* itsWeight;
};
 
CAT::~CAT()
{
    delete itsAge; itsAge=0;
    delete itsWeight; itsWeight=0;
}
 
CAT::CAT()
{
    itsAge = new int;
    itsWeight = new int;
    *itsAge = 5;
    *itsWeight=9;
}
 
CAT& CAT::operator=(const CAT& rhs)
{
    if(this == &rhs)
        return *this;
    
    *itsAge=rhs.GetAge();
    *itsWeight=rhs.GetWeight();
    return *this;
}
 
int main()
{
    CAT Frisky;
    cout << "Frisky's age: " << Frisky.GetAge() << endl;
    Frisky.SetAge(6);
    
    CAT whiskers = Frisky;
    Frisky.SetAge(0);
    cout << "whisker's age: " << whiskers.GetAge() << endl;
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2010, 14:16     Как передалеть operator= класса?
Посмотрите здесь:

operator+ как член класса - C++
Могу ли я сделать operator+ как член класса таким образом? myClass&amp; myClass::operator+(const myClass&amp; other1, const myClass&amp; other2) { ...

Как перенести operator из базового класса в производный? - C++
Добрый день! Подскажите, пожалуйста, на простых примерах, как нужно работать с оператором перегрузки операций, если он находится в...

Operator< для класса - C++
Всем добра, что-то я туплю подскажите как определить operator&lt; для класса, в классе два значение если какое-нибудь меньше то тру. class...

operator[][] для класса - C++
Добрый день, создал класс где храниться массив, и хотелось бы иметь напрямю доступ через по типу class Matrix { .... int ** data; ...

Перегрузка operator* у класса Complex - C++
Complex* Complex::operator*(const Complex&amp; other) const { Complex* product = this; *product *= other; return product; }...

Перегрузка operator>> для производного класса - C++
Базовый класс: Taxi_Car.h: #pragma once #include&lt;string&gt; using namespace std; class Taxi_Car { string Marka;

Не работает operator<< шаблонного класса Vector - C++
Компилятор выдает ошибку error LNK2019: unresolved external symbol &quot;class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __cdecl...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 15:20     Как передалеть operator= класса? #16
Я то понимаю

Добавлено через 1 минуту
CAT whiskers = Frisky;
вызов конструктора копирования по умолчанию, и как результат,
несколько указателей ссылаются на одну область памяти.

Добавлено через 51 секунду
Это не операция присваивание, если кому интересно.

Добавлено через 4 минуты
Мне удивительно, почему это прога, работает, нормально.
У меня после выполнения main, программа завершается аварийно.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 15:20     Как передалеть operator= класса? #17
Цитата Сообщение от Genius Ignat Посмотреть сообщение
вызов конструктора копирования по умолчанию,
а есть конструкторы копирования не по умолчанию?
insideone
20.01.2010, 15:21
  #18

Не по теме:

Это явный пример неоднозначности воспринимаемости C++ и наличие в нем различного рода граблей! =) Вроде думаешь так оно должно делаться ан нет, открой книжечку на страничке 1024 и прочитай что не так а эдак)

Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 15:25     Как передалеть operator= класса? #19
zim22:
Если конструктор копирования не определён, как же его называть.
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 15:41  [ТС]     Как передалеть operator= класса? #20
>> insideone

Молодец, выбрал легкий путь. Я твою программу не проверял, но если она заработает как надо - то это просто везение, т. к. конструктор по умолчанию поверхностно (тупо) копирует объекты класса. В данном случае - адреса указателей. Если какой-либо объект выйдет за зону видимости программы, результат использования второго объекта будет непредсказуем.

А кто-то может написать код исправленной программы?
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
20.01.2010, 15:44     Как передалеть operator= класса? #21
А разве выполняется констуктор по умолчанию (в смысле генерируемый компилятором стандатный и тупой)? Помоему выполняется конструктор копирования который я сам написал О_о мне стало страшно запутаться, ведь я только подумал что понял это! Пожалуйста проверьте код построчно и посмотрите что выполняется чтобы убедиться точно... По мне код выполняется правильно как и требовалось без всяких везений...
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 16:02  [ТС]     Как передалеть operator= класса? #22
Вроде бы все работает, но память немного утекает:
C++
1
2
3
4
5
6
CAT::CAT(CAT& From)
{
          itsAge = new int;
        *itsAge = *From.itsAge;
 
}
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
20.01.2010, 16:05     Как передалеть operator= класса? #23
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
#include <iostream>
using namespace std;
 
class Cat
{
public:
    Cat();
    Cat(int, int);
    Cat(const Cat&);
 
    ~Cat();
 
    int GetAge()    const   { return *itsAge; }
    int GetWeight() const   { return *itsWeight; }
    void SetAge(int age)    { *itsAge = age; }
 
    Cat& operator = (const Cat&);
 
private:
    int* itsAge;
    int* itsWeight;
};
 
Cat::~Cat()
{
    delete itsAge;      itsAge      = 0;
    delete itsWeight;   itsWeight   = 0;
}
 
Cat::Cat()
    : itsAge(0), itsWeight(0)
{
    itsAge      = new int;
    itsWeight   = new int;
 
    *itsAge     = 0;
    *itsWeight  = 0;
}
 
Cat::Cat(int a, int b)
    : itsAge(0), itsWeight(0)
{
    itsAge      = new int;
    itsWeight   = new int;
 
    *itsAge     = a;
    *itsWeight  = b;
}
Cat::Cat(const Cat& rhs)
    : itsAge(0), itsWeight(0)
{
    *this = rhs;
}
 
Cat& Cat::operator = (const Cat& rhs)
{
    if(this == &rhs)
        return *this;
 
    delete itsAge;
    delete itsWeight;
 
    itsAge      = new int;
    itsWeight   = new int;
 
    *itsAge     = rhs.GetAge();
    *itsWeight  = rhs.GetWeight();
 
    return *this;
}
 
int main()
{
    Cat Frisky;
    cout << "Frisky's age: " << Frisky.GetAge() << endl;
    Frisky.SetAge(6);
 
    Cat whiskers = Frisky;
    Frisky.SetAge(0);
    cout << "whisker's age: " << whiskers.GetAge() << endl;
 
    {
        Cat x(10,15);
 
        cout << "x age: " << x.GetAge() << endl;
 
        Frisky = x;
    }
 
 
    cout << "Frisky's " << Frisky.GetWeight() << endl;
 
    return 0;
}
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:12     Как передалеть operator= класса? #24
ISergey
C++
1
2
3
4
5
Cat::Cat(const Cat& rhs)
        : itsAge(0), itsWeight(0)
{
        *this = rhs;
}
Хитёр.

Добавлено через 1 минуту
В некоторых случаях сам таким способом пользуюсь.

Добавлено через 1 минуту
Единственно^ в сзязи с этим надо переделать деструктор
C++
1
2
3
4
5
6
7
Cat::~Cat()
{
        if((itsAge!=0)&&(itsWeight!=0)){
        delete itsAge;          itsAge          = 0;
        delete itsWeight;       itsWeight       = 0;
}
}
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
20.01.2010, 16:13     Как передалеть operator= класса? #25
Единственно^ в сзязи с этим надо переделать деструктор
Зачем?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:13     Как передалеть operator= класса? #26
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Хитёр.
может быть Ленив?

конструктор копирования реализованный на базе оператора присвоения делает ненужные ему вещи: удаляет только что созданные переменные и проводит проверку на равенство, которая никогда не будет true
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:14     Как передалеть operator= класса? #27
Вот пример из простого:
void main(){

int * a =0;
delete a; //что будет как думаешь.

}
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,468
20.01.2010, 16:15     Как передалеть operator= класса? #28
2 Genius Ignat А зачем? Ведь везде делается new int что исключает появление 0... или нет? (кроме случая когда память кончилась :-D )
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:20     Как передалеть operator= класса? #29
[CPP]Cat::Cat(const Cat& rhs)
: itsAge(0), itsWeight(0)
{
*this = rhs;
}[/CPP
no comment]
Ты внимательно весь пост почитай проблема не в операции =

Добавлено через 1 минуту

Вот ещё кое-что заметил только в операции =
C++
1
2
3
4
5
6
        
 if(this == &rhs)
                return *this;
 
        delete itsAge;        //опасно  itsAge ==NULL;
        delete itsWeight;    //опасно  itsWeight ==NULL;
Добавлено через 1 минуту
переделывается аналогично деструктору
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2010, 16:24     Как передалеть operator= класса?
Еще ссылки по теме:

Перегрузка operator<< для шаблонного класса - C++
Добрый день не могу понять как реализовать перегрузку &lt;&lt; для шаблонного класса template &lt;class T&gt; class List { public: ...

Реализовать перегрузку operator+() для пользователского класса - C++
Есть класс ДРОБЬ, его члены ЧИСЛИТЕЛЬ И ЗНАМЕНАТЕЛЬ, а методы - конструктор и методы вывода. исходные данные - 4 обычные дроби. мне нужно...

Шаблоны классов, перегрузка operator<< класса ostream - C++
Не компилируется программа. fatal error: 1 unresolved externals Как правильно определить operator&lt;&lt; ??? #include &lt;iostream&gt; ...

Перегрузка operator< для двух экземпляров класса отрезок - C++
Всем добра, в классе отрезок хочу перегрузить операцию &lt; правильно ли я сделал ? При этом отрезок с координатами x1=1 y1=1 и x2=4 y2=4...

Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода) - C++
Здравствуйте. Перегружаю оператор вывода для шаблонного класса. using namespace std; template &lt;class Element&gt; class List { ...


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

Или воспользуйтесь поиском по форуму:
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
20.01.2010, 16:24     Как передалеть operator= класса? #30
Открой стандарт и прочти пункт 5.3.5
http://codepad.org/jthmcAuD
Yandex
Объявления
20.01.2010, 16:24     Как передалеть operator= класса?
Ответ Создать тему
Опции темы

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