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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2010, 14:16
Ответы с готовыми решениями:

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

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

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

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

78
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
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
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:35 3
insideone, гениально, Ватсон!
***
всмысле - взять и закомментить кусок кода
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.01.2010, 14:44 4
Я надеюсь это не намек на отладчик Windows )) Я правда этого не знал! =) Ведь я всего лишь самоучка который не читал ни одной книги по C++ ) В ближайшее время прикуплю парочку и буду уже высказываться как специалист когда освою :-D Все равно на примерах интереснее изучать )

Добавлено через 1 минуту
Вообще то я сначало его закоментил чтобы проверить что будет делать компилятор без него)) Просто там точка останова не выполнялась. А потом дописал конструктор копирования) Разкоментить обратно забылось
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:45 5
проблема в том, что при копировании по-умолчанию используется почленное копирование данных.
если же в классе имеются указатели - то соответственно при копировании они будут указывать на один и тот-же адрес в памяти.
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.01.2010, 14:47 6
Т.е. если класс содержит указатели надо в любом случае для него писать констукторы?) А если нет то переменные будут как статик прям? (для разных объектов одни и те же)
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 14:49 7
Цитата Сообщение от insideone Посмотреть сообщение
Т.е. если класс содержит указатели надо в любом случае для него писать констукторы?
не конструкторы.
а конструктор копирования, деструктор, оператор присвоения
Цитата Сообщение от insideone Посмотреть сообщение
А если нет то переменные будут как статик прям? (для разных объектов одни и те же)
статик - это ОДНА И ТАЖЕ переменная для всех экземпляторов класса
а в нашем случае переменные будут разные, просто значение, которое в них хранится -совпадает
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 15:00 8
zim22:
Однозначно.
Если не написать будет страшная ошибка:
Если не определить конструктор копирования:
Указатели двух объектов(участвующих в копировании) будут хранить адрес одного участка памяти это нехорошо.
Короче говоря в конструкторе копирование надо сделать new и выделить
в указатель адрес другого участка памяти:

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

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

Не по теме:

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

0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 15:02 10
C++
1
  CAT whiskers = Frisky; //вызов конструктора копирования, если кому интересно
0
Автор FAQ
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
20.01.2010, 15:03 11
статик - это ОДНА И ТАЖЕ переменная для всех экземпляторов класса
а в нашем случае переменные будут разные, просто значение, которое в них хранится -совпадает
Т.е. один объект будет иллегально обращаться к переменной другого объекта? Это в принципе как ошибка или как возможность языка?)
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 15:05 12
ISergey:
Но если хочешь что во время использования объекта, он внезапно испортился с помощью деструктора другого объекта тогда всё нормуль.
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 15:08 13
Цитата Сообщение от insideone Посмотреть сообщение
Это в принципе как ошибка или как возможность языка?)
возможность
0
ISergey
20.01.2010, 15:11
  #14

Не по теме:

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

0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
20.01.2010, 15:12 15
Цитата Сообщение от ISergey Посмотреть сообщение
Genius Ignat У вас действительно так туго с русским или вы специально искажаете текст..?
я думаю текст искажается нечаянно. из-за непонимания того, о чём идет речь.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 15:20 16
Я то понимаю

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

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

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

Не по теме:

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

0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
20.01.2010, 15:25 19
zim22:
Если конструктор копирования не определён, как же его называть.
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 15:41  [ТС] 20
>> insideone

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

А кто-то может написать код исправленной программы?
0
20.01.2010, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2010, 15:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru