Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224

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

20.01.2010, 14:16. Показов 8376. Ответов 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;
}
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2010, 14:16
Ответы с готовыми решениями:

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

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

Класс: Почему этот operator+ не хочет работать как функция внутри класса?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class complex{ private: int re, im; public: complex(int r,...

78
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.01.2010, 15:44
А разве выполняется констуктор по умолчанию (в смысле генерируемый компилятором стандатный и тупой)? Помоему выполняется конструктор копирования который я сам написал О_о мне стало страшно запутаться, ведь я только подумал что понял это! Пожалуйста проверьте код построчно и посмотрите что выполняется чтобы убедиться точно... По мне код выполняется правильно как и требовалось без всяких везений...
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 16:02  [ТС]
Вроде бы все работает, но память немного утекает:
C++
1
2
3
4
5
6
CAT::CAT(CAT& From)
{
          itsAge = new int;
        *itsAge = *From.itsAge;
 
}
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
20.01.2010, 16:05
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;
}
2
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:12
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;
}
}
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
20.01.2010, 16:13
Единственно^ в сзязи с этим надо переделать деструктор
Зачем?
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:13
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Хитёр.
может быть Ленив?

конструктор копирования реализованный на базе оператора присвоения делает ненужные ему вещи: удаляет только что созданные переменные и проводит проверку на равенство, которая никогда не будет true
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:14
Вот пример из простого:
void main(){

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

}
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.01.2010, 16:15
2 Genius Ignat А зачем? Ведь везде делается new int что исключает появление 0... или нет? (кроме случая когда память кончилась :-D )
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:20
[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 минуту
переделывается аналогично деструктору
0
Maniac
Эксперт С++
 Аватар для ISergey
1465 / 966 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
20.01.2010, 16:24
Открой стандарт и прочти пункт 5.3.5
http://codepad.org/jthmcAuD
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:25
ISergey:
У тебя какой компилятор:
C++
1
2
3
4
5
6
void main(){
 
int * a =0;
delete a; //что будет как думаешь.
 
}
И что программа работает.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:29
Цитата Сообщение от Genius Ignat Посмотреть сообщение
У тебя какой компилятор
причём здесь компилятор? есть поведение, регламентированное стандартом.

если попытаться удалить нулевой указатель - то ничего не будет
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:30
Странно Windows выкидывает ошибку.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:32
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Странно Windows выкидывает ошибку.
а чайник на кухне не кипит? ...
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:35
удалить нулевой указатель - то ничего не будет
Вообще то мы не указатель удаляем, мы освобождаем память через её адрес в указателе.

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

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

Не по теме:

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

0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:42
Освобождение адреса: 0x00000000, ни к чему хорошему не приводит.

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

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

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

Добавлено через 2 минуты
insideone
Меня твои цитаты не удивляют.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:43
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Освобождение адреса: 0x00000000, ни к чему хорошему не приводит.
а с чего ты взял что он освобождается?
посмотри реализацию operator delete
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 16:46
zim22:
А ты посмотри atlbase.h

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

Добавлено через 1 минуту
посмотри реализацию operator delete
где посмотреть?
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 16:48
Цитата Сообщение от 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 */
         ...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2010, 16:48

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru