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

C++

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

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

20.01.2010, 14:16. Просмотров 4981. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
20.01.2010, 14:34     Как передалеть operator= класса? #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)
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:35     Как передалеть operator= класса? #3
insideone, гениально, Ватсон!
***
всмысле - взять и закомментить кусок кода
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
20.01.2010, 14:44     Как передалеть operator= класса? #4
Я надеюсь это не намек на отладчик Windows )) Я правда этого не знал! =) Ведь я всего лишь самоучка который не читал ни одной книги по C++ ) В ближайшее время прикуплю парочку и буду уже высказываться как специалист когда освою :-D Все равно на примерах интереснее изучать )

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

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

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

Не по теме:

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

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

Не по теме:


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

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

Перегрузка operator* у класса Complex C++
C++ Перегрузка operator< для двух экземпляров класса отрезок
Перегрузка operator>> для производного класса C++
C++ Перегрузить operator<<() для шаблонного класса (перегрузка оператора вывода)
C++ Реализовать перегрузку operator+() для пользователского класса

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

Или воспользуйтесь поиском по форуму:
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 15:41  [ТС]     Как передалеть operator= класса? #20
>> insideone

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

А кто-то может написать код исправленной программы?
Yandex
Объявления
20.01.2010, 15:41     Как передалеть operator= класса?
Ответ Создать тему
Опции темы

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