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

C++

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

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

20.01.2010, 14:16. Просмотров 4963. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
21.01.2010, 01:30  [ТС]     Как передалеть operator= класса? #61
>> CyBOSSeR (про указатели)

Использование динамической памяти для хранения переменных класса расширяет возможности их использования!
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.01.2010, 01:40     Как передалеть operator= класса? #62
insideone, смысл сказанного немного в другом. Страуструп говорит о том, что если уж так нужен NULL, то не стоит использовать макрос NULL
C++
1
#define NULL 0
а вместо этого использовать константу
C++
1
const int NULL = 0;
В стандарте C++ ISO/IEC 14882:2003 про NULL написано следующее:
The macro NULL is an implementation-defined C++ null pointer constant in this International Standard
Значение NULL зависит от реализации и не всегда равен 0. Т.е. в отличии от 0 он является переносимым.

Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Использование динамической памяти для хранения переменных класса расширяет возможности их использования!
Как именно расширяются возможности их использования? Пример можно какой-нибудь?
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
21.01.2010, 01:45     Как передалеть operator= класса? #63
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Значение NULL зависит от реализации и не всегда равен 0. Т.е. в отличии от 0 он является переносимым.
Тогда и вправду лучше завести свой #define для удобства и безопасности (в том что NULL будет 0, а не чем то там вроде "implementation-defined C++ null pointer")? Т.к. NULL как то повышает читаемость кода и не хотелось бы отказываться от такого удобного указания.
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.01.2010, 01:53     Как передалеть operator= класса? #64
Цитата Сообщение от insideone Посмотреть сообщение
Тогда и вправду лучше завести свой #define для удобства и безопасности
Как раз таки этого делать не стоит. Просто стоит использовать NULL, а вот уже его значение будет зависеть от платформы на которой будешь компилироваться.
insideone
Модератор
Автор FAQ
3635 / 913 / 48
Регистрация: 10.01.2010
Сообщений: 2,460
21.01.2010, 01:58     Как передалеть operator= класса? #65
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как раз таки этого делать не стоит. Просто стоит использовать NULL, а вот уже его значение будет зависеть от платформы на которой будешь компилироваться.
Так нет же, Страуструп говорит что "использование нуля приведет к меньшим проблемам" (кстати сама фраза жесть, значит типа куда не пойдёшь все равно проблемы - большие или меньшие явный намек на ГРАБЛИ). Т.е. если мне допустим надо указать на то что указатель пуст я пишу
A = NULL;
Страуструп говорит пишите
A = 0; // (ну то что вместо этого константе - это не особо разница)
Получается, как вы говорите про NULL то что он может быть разным - т.е. если я напишу по совету Страуструпа я получу ошибку? Или я чего то недопонимаю...
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.01.2010, 02:05     Как передалеть operator= класса? #66
Цитата Сообщение от insideone Посмотреть сообщение
Получается, как вы говорите про NULL то что он может быть разным - т.е. если я напишу по совету Страуструпа я получу ошибку?
Ответ на этот вопрос дал Evg здесь.
Цитата Сообщение от Evg Посмотреть сообщение
На сигнальных процессорах зачастую 0 является валидным адресом.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
21.01.2010, 11:10     Как передалеть operator= класса? #67
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Использование динамической памяти для хранения переменных класса расширяет возможности их использования!
угу. вглубь и впоперёк.

Добавлено через 1 минуту
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как именно расширяются возможности их использования? Пример можно какой-нибудь?
например в паттернах проектирования классы часто содержат указатель на другой класс, что делает возможным в runtime менять поведение/отношения класса.
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
21.01.2010, 11:49  [ТС]     Как передалеть operator= класса? #68
>> CyBOSSeR
(Как именно расширяются возможности их использования? Пример можно какой-нибудь?)

Да многократно. Посмотрите пример выше.
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
21.01.2010, 11:57     Как передалеть operator= класса? #69
OVERPOWER8, я позволю себе уточнить вопрос CyBOSSeR. Думаю он это имел ввиду:
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как именно в приведённом тобой коде расширяются возможности их использования?
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.01.2010, 16:04     Как передалеть operator= класса? #70
Цитата Сообщение от zim22 Посмотреть сообщение
например в паттернах проектирования классы часто содержат указатель на другой класс, что делает возможным в runtime менять поведение/отношения класса.
С этим вариантам использования указателей для расширения возможностей класса все ясно как день.

Цитата Сообщение от zim22 Посмотреть сообщение
OVERPOWER8, я позволю себе уточнить вопрос CyBOSSeR. Думаю он это имел ввиду:
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как именно в приведённом тобой коде расширяются возможности их использования?
zim22, ты абсолютно прав.

OVERPOWER8, каким образом использование указателя для хранения таких элементарных данных как возраст расширяет возможности (какие, куда)?
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
21.01.2010, 17:43  [ТС]     Как передалеть operator= класса? #71
>> CyBOSSeR >> zim22

А что это вы так привязались ко мне? Просто мне нравится использовать указатели и всё!
Иногда, конечно, сталкиваюсь с некоторыми проблемами, но они решаются сами по себе.

Вы что, предлагаете использовать обычные переменные в качестве членов класса? Если вдруг памяти не хватит, а обект класса будет создан - что дальше будет?
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,327
21.01.2010, 17:52     Как передалеть operator= класса? #72
Если памяти не хватит - объект класса просто не будет создан. Вот и все.
А если ты будешь создавать члены класса в динамической памяти - под них что, разве памяти не потребуется?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
21.01.2010, 17:59     Как передалеть operator= класса? #73
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А что это вы так привязались ко мне?
просто ты должен отвечать за свои слова. городишь какие-то фразы непонятные, ничем необоснованные. те, кто только знакомится с С++ - почитав твои некомпетентные посты могут сделать неправильные выводы.
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
21.01.2010, 20:14     Как передалеть operator= класса? #74
Цитата Сообщение от zim22 Посмотреть сообщение
просто ты должен отвечать за свои слова. городишь какие-то фразы непонятные, ничем необоснованные. те, кто только знакомится с С++ - почитав твои некомпетентные посты могут сделать неправильные выводы.
zim22, +1.

Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Иногда, конечно, сталкиваюсь с некоторыми проблемами, но они решаются сами по себе.
Причиной появления этой темы как раз таки явились проблемы из-за твоей безосновательной и опасной практики использования указателей для хранения элементарных данных, разве не так? Тебе уже не один человек доводы приводит против такого подхода.
insideone
21.01.2010, 20:21
  #75

Не по теме:

Каждому человеку своя грабля! Соблюдайте права граждан =)

Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
21.01.2010, 20:53     Как передалеть operator= класса? #76
OVERPOWER8:
Такие вещи говоришь, будто ты всё знаешь,
а проблема в твоем посте решается как 2 пальца обо асфальт.
Зачем ты вообще создал тему, если ты такой умный, тебе наверное советы не нужны.
CyBOSSeR
21.01.2010, 22:18
  #77

Не по теме:

Цитата Сообщение от insideone Посмотреть сообщение
Каждому человеку своя грабля!
Просто OVERPOWER8 прыгает на граблях, да еще и пытается доказать что это поведение имеет преимущества.
Мазохизм какой-то.

OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
21.01.2010, 23:49  [ТС]     Как передалеть operator= класса? #78
>> CyBOSSeR >> Genius Ignat

Ладно, ладно. Беру свои слова обратно. Использование указателей усложняет программу, однако в некоторых случаях значительно увеличивает ей гибкость.

И вообще - я никому не советую и не рекомендую использовать указатели там где, "не надо". Пусть каждый использует что хочет. А я всё равно буду использовать указатели!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2010, 12:23     Как передалеть operator= класса?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Genius Ignat
1234 / 772 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
22.01.2010, 12:23     Как передалеть operator= класса? #79
OVERPOWER8:
Если хочешь, узнать про гибкость прочитай про интеллектуальные указатели, от них пользы больше.

Если знаний и опыта мало, спорить бывает бесполезно.
Кто тому же бывает, что споры ни к чему хорошему не приводят, по себе знаю.
Хорошо что ты все понял.
Yandex
Объявления
22.01.2010, 12:23     Как передалеть operator= класса?
Ответ Создать тему
Опции темы

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