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

C++

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

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

20.01.2010, 14:16. Просмотров 5000. Ответов 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...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 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
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 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
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
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 минуту
переделывается аналогично деструктору
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 1
20.01.2010, 16:24     Как передалеть operator= класса? #30
Открой стандарт и прочти пункт 5.3.5
http://codepad.org/jthmcAuD
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:25     Как передалеть operator= класса? #31
ISergey:
У тебя какой компилятор:
C++
1
2
3
4
5
6
void main(){
 
int * a =0;
delete a; //что будет как думаешь.
 
}
И что программа работает.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:29     Как передалеть operator= класса? #32
Цитата Сообщение от Genius Ignat Посмотреть сообщение
У тебя какой компилятор
причём здесь компилятор? есть поведение, регламентированное стандартом.

если попытаться удалить нулевой указатель - то ничего не будет
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:30     Как передалеть operator= класса? #33
Странно Windows выкидывает ошибку.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:32     Как передалеть operator= класса? #34
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Странно Windows выкидывает ошибку.
а чайник на кухне не кипит? ...
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:35     Как передалеть operator= класса? #35
удалить нулевой указатель - то ничего не будет
Вообще то мы не указатель удаляем, мы освобождаем память через её адрес в указателе.

Добавлено через 52 секунды
Значит у меня такая умная ОС.

Добавлено через 2 минуты
А посути мы пытаемся обратиться по нулевому адресу, что бы его освободить.
Вот такую ошибку Windows и выдает.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
20.01.2010, 16:36     Как передалеть operator= класса? #36
Нулевые указатели придуманы как удобный способ «отметить» указатели, которые заведомо не указывают на корректный адрес в памяти.
Хорошим стилем программирования является присваивание указателю после освобождения памяти, на которую он ссылался, нулевого указателя, так как автоматически этого не происходит (зачастую, после освобождения памяти значение адреса, на который указывает указатель, остается тем же, но память уже может быть недоступна и выделена под другой объект). Кроме этого, применение обнуления указателей актуально для безопасности освобождения памяти: операция delete безопасна для нулевого указателя.
by http://ru.wikipedia.org/wiki/NULL_(Си)

Не по теме:

Читал недавно у разработчиков игр на консоли с этим проблемы, т.к. там нулевой адресс не обладает такими св-вами. А нам вот все удобства! =)

Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:42     Как передалеть operator= класса? #37
Освобождение адреса: 0x00000000, ни к чему хорошему не приводит.

Добавлено через 30 секунд
insideone:
А ты думаешь я этого не знаю.

Добавлено через 52 секунды
Наверное не все ОС адекватно реагируют на такое событие.

Добавлено через 1 минуту
Не зря в библиотеки ATL,
в интеллектуальных указателях есть макросы assert выбрасывающие сообщение об ошибке:
которые осведомляю о подобных ситуации: обращению к NULL адресу.

Добавлено через 2 минуты
insideone
Меня твои цитаты не удивляют.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:43     Как передалеть operator= класса? #38
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Освобождение адреса: 0x00000000, ни к чему хорошему не приводит.
а с чего ты взял что он освобождается?
посмотри реализацию operator delete
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 16:46     Как передалеть operator= класса? #39
zim22:
А ты посмотри atlbase.h

Добавлено через 43 секунды
Вдруг что то изменилось, сейчас по смотрю у себя в Visual Studio 2008

Добавлено через 1 минуту
посмотри реализацию operator delete
где посмотреть?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2010, 16:48     Как передалеть 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 { ...


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

Или воспользуйтесь поиском по форуму:
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:48     Как передалеть operator= класса? #40
Цитата Сообщение от Genius Ignat Посмотреть сообщение
где посмотреть?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void operator delete(
        void *pUserData
        )
{
        _CrtMemBlockHeader * pHead;
 
        RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
 
        if (pUserData == NULL)   // !!!!!! ФОКУС-ПОКУС
            return;
 
        _mlock(_HEAP_LOCK);  /* block other threads */
         ...
Yandex
Объявления
20.01.2010, 16:48     Как передалеть operator= класса?
Ответ Создать тему
Опции темы

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