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

C++

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

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

20.01.2010, 14:16. Просмотров 5086. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2010, 14:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передалеть operator= класса? (C++):

operator [что попало] - C++
Кто пользуется перегрузками типа class TPoint {public: double x,y,z;} class B {public: operator operator (TPoint);}, class B {public:...

Перегрузка operator+ в собственном класе MyString - C++
Хочу сделать перегрузить оператор +, что бы можно было делать: /* ... */ MyString a = MyString(&quot;name&quot;); MyString b = MyString(&quot;...

Как исправить ошибку - Could not find a match for 'operator AnsiString::=(TDateTime)' - C++ Builder
Организовать хранение данных в файле в следущую структуру, фио, дата, время 1) Написать процедуру считывания этого файла 2) Сколько раз...

Как правильно создать массив объектов текущего класса в методе данного класса? - C++ Builder
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...

operator= - C++ Builder
class mnogo4len { protected: int *N; float *koef; public: mnogo4len(); //конструктор ...

Трудности с перегрузкой operator<< - Visual C++
такая пробла.. когда перегружаю operator&lt;&lt; возникает какоя ошибка Ошибка 1 error C2662: TBitField::GetBit: невозможно преобразовать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
20.01.2010, 14:34 #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
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
#include <iostream>
using namespace std;
 
class CAT
{
        public:
                CAT();
                ~CAT();
                CAT(CAT& From);
                int GetAge() const { return *itsAge; }
                void SetAge(int age) { *itsAge = age; }
               // CAT operator=(const CAT);
        
        private:
                int* itsAge;
};
 
CAT::~CAT()
{
        delete itsAge; itsAge=0;
}
 
CAT::CAT()
{
        itsAge = new int;
        *itsAge = 5;
}
 
CAT::CAT(CAT& From)
{
        itsAge = new int;
        *itsAge = *From.itsAge;
 
}
/*
CAT CAT::operator=(const CAT rhs)
{
        if(this == &rhs)
                return (*this);
        
        *itsAge=rhs.GetAge();
        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;
}
Познавательно! Необходим был конструктор копирования http://ru.wikipedia.org/wiki/Конструктор_копирования . Для CAT whiskers не вызывался CAT::CAT() я так понял. В дебаге видно что Frisky и whiskers ссылались на один и тот же объект (whiskers ссылка на Frisky)
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:35 #3
insideone, гениально, Ватсон!
***
всмысле - взять и закомментить кусок кода
0
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
20.01.2010, 14:44 #4
Я надеюсь это не намек на отладчик Windows )) Я правда этого не знал! =) Ведь я всего лишь самоучка который не читал ни одной книги по C++ ) В ближайшее время прикуплю парочку и буду уже высказываться как специалист когда освою :-D Все равно на примерах интереснее изучать )

Добавлено через 1 минуту
Вообще то я сначало его закоментил чтобы проверить что будет делать компилятор без него)) Просто там точка останова не выполнялась. А потом дописал конструктор копирования) Разкоментить обратно забылось
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:45 #5
проблема в том, что при копировании по-умолчанию используется почленное копирование данных.
если же в классе имеются указатели - то соответственно при копировании они будут указывать на один и тот-же адрес в памяти.
0
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
20.01.2010, 14:47 #6
Т.е. если класс содержит указатели надо в любом случае для него писать констукторы?) А если нет то переменные будут как статик прям? (для разных объектов одни и те же)
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:49 #7
Цитата Сообщение от insideone Посмотреть сообщение
Т.е. если класс содержит указатели надо в любом случае для него писать констукторы?
не конструкторы.
а конструктор копирования, деструктор, оператор присвоения
Цитата Сообщение от insideone Посмотреть сообщение
А если нет то переменные будут как статик прям? (для разных объектов одни и те же)
статик - это ОДНА И ТАЖЕ переменная для всех экземпляторов класса
а в нашем случае переменные будут разные, просто значение, которое в них хранится -совпадает
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 15:00 #8
zim22:
Однозначно.
Если не написать будет страшная ошибка:
Если не определить конструктор копирования:
Указатели двух объектов(участвующих в копировании) будут хранить адрес одного участка памяти это нехорошо.
Короче говоря в конструкторе копирование надо сделать new и выделить
в указатель адрес другого участка памяти:

Добавлено через 2 минуты
Надеюсь код приводить не надо.

Добавлено через 15 секунд
Надеюсь код приводить не надо.
0
ISergey
20.01.2010, 15:02
  #9

Не по теме:

Цитата Сообщение от Genius Ignat Посмотреть сообщение
надо сделать new и выделить в указатель адрес другого участка памяти:
Гонишь..

0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 15:02 #10
C++
1
  CAT whiskers = Frisky; //вызов конструктора копирования, если кому интересно
0
insideone
Модератор
Автор FAQ
3639 / 918 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
20.01.2010, 15:03 #11
статик - это ОДНА И ТАЖЕ переменная для всех экземпляторов класса
а в нашем случае переменные будут разные, просто значение, которое в них хранится -совпадает
Т.е. один объект будет иллегально обращаться к переменной другого объекта? Это в принципе как ошибка или как возможность языка?)
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
20.01.2010, 15:05 #12
ISergey:
Но если хочешь что во время использования объекта, он внезапно испортился с помощью деструктора другого объекта тогда всё нормуль.
0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 15:08 #13
Цитата Сообщение от insideone Посмотреть сообщение
Это в принципе как ошибка или как возможность языка?)
возможность
0
ISergey
20.01.2010, 15:11
  #14

Не по теме:


Genius Ignat У вас действительно так туго с русским или вы специально искажаете текст..?

0
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 15:12 #15
Цитата Сообщение от ISergey Посмотреть сообщение
Genius Ignat У вас действительно так туго с русским или вы специально искажаете текст..?
я думаю текст искажается нечаянно. из-за непонимания того, о чём идет речь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2010, 15:12
Привет! Вот еще темы с ответами:

Error C2593: 'operator +=' is ambiguous - Visual C++
вообщем тема такая учусь програмить все когда то этим занимались, вот запоролся на вводе текста с клавиатуры: void...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.01.2010, 15:12
Ответ Создать тему
Опции темы

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