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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.88
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.01.2010, 14:16     Как передалеть operator= класса? #1
Вот готовая программа, но там одна проблема - после использования оператора=, при изменении значений в одном объекте класса, они изменяются и в другом. Другими словами, как сделать так, чтобы вывод программы был:

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
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
21.01.2010, 01:30  [ТС]     Как передалеть operator= класса? #61
>> CyBOSSeR (про указатели)

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

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

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

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

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

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

Вы что, предлагаете использовать обычные переменные в качестве членов класса? Если вдруг памяти не хватит, а обект класса будет создан - что дальше будет?
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,315
21.01.2010, 17:52     Как передалеть operator= класса? #72
Если памяти не хватит - объект класса просто не будет создан. Вот и все.
А если ты будешь создавать члены класса в динамической памяти - под них что, разве памяти не потребуется?
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
21.01.2010, 17:59     Как передалеть operator= класса? #73
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А что это вы так привязались ко мне?
просто ты должен отвечать за свои слова. городишь какие-то фразы непонятные, ничем необоснованные. те, кто только знакомится с С++ - почитав твои некомпетентные посты могут сделать неправильные выводы.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 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
1233 / 771 / 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
 Аватар для 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
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
22.01.2010, 12:23     Как передалеть operator= класса? #79
OVERPOWER8:
Если хочешь, узнать про гибкость прочитай про интеллектуальные указатели, от них пользы больше.

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

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