Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
1

Перегрузка операторов, указатели

27.04.2017, 15:39. Показов 1960. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Помогите пожалуйста разобраться с перегрузкой постинкремента. Не могу понять, почему при присваивании объекта заданного класса объекту другого класса с постинкрементом получается непонятное значение...


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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
    #include <iostream>
    using namespace std;
    typedef unsigned short int USH;
    
    class SimpleCircle
    {
        public:
            SimpleCircle(){itsRadius = new USH;*itsRadius = 0;
        }
            SimpleCircle(int); 
            ~SimpleCircle() { delete itsRadius;itsRadius = 0; }
            SimpleCircle(SimpleCircle &) ;
            
            const SimpleCircle &operator ++ ();
            const SimpleCircle operator ++ (int x);
            
            void SetRad(USH rad);
            USH GetRad();
    
        private:
            USH *itsRadius; 
            
        
    };
    
    SimpleCircle :: SimpleCircle(int x) //Перегрузка конструктора
    {
        itsRadius = new USH;
        *itsRadius = x;
        
    }
    
    SimpleCircle :: SimpleCircle(SimpleCircle &rhs) //Конструктор - копировщик
    {
        itsRadius = new USH;
        *itsRadius = rhs.GetRad();
        cout << "\ncopy constructor\n ";
    }
    
    const SimpleCircle &SimpleCircle :: operator ++ () //Преинкремент
    {
        ++ (*itsRadius);
        return (*this);
    }
    
     const SimpleCircle SimpleCircle :: operator ++ (int x) //Проблема с данной функцией
    {
        SimpleCircle temp(*this);
        ++(*itsRadius);
        return temp;
        
    }
    
    void SimpleCircle :: SetRad(USH rad)
    {
        *itsRadius = rad;
    }
    
    USH SimpleCircle :: GetRad()
    {
        return (*itsRadius);
    }
    
    int main()
    {
        SimpleCircle Circ;
        Circ.SetRad(3);
        ++ Circ;
        ++ Circ;
        cout << "\n Circ = " << Circ.GetRad();
        Circ ++ ;
        cout << "\n Circ = " << Circ.GetRad();
                
        SimpleCircle A;
        Circ ++; //Значение Circ = 7
        A = Circ++;//Присваивается значение А = 3840..Почему??, а Circ = 8
        A++;
        cout << "\n Circ = " << Circ.GetRad() << "\nAnd A = " << A.GetRad();
        
        return 0;
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2017, 15:39
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

перегрузка операторов
Товарисссчи, что значит запись: CVector2D::operator+(CVector2D const&amp; v1)const файл *срр и чем...

Перегрузка операторов
Привет, не подскажите, почему у меня тут не работает правильно += оператор. #include &lt;iostream&gt;...

Перегрузка операторов
Я новичек в С++, столкнулась с перегрузкой операторов. Подскажите пожалуйста в чем принципиальное...

16
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
27.04.2017, 15:49 2
Цитата Сообщение от Antnemo Посмотреть сообщение
A = Circ++;
Вызывается operator=, который просто скопирует указатель на USH из Circ++ в A. Потом объект Circ++ удалится и указатель будет не валидным.
0
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
27.04.2017, 15:59  [ТС] 3
По задумке необходимо, чтобы значение разыменованного указателя *itsRadius в объекте Circ копировалось в объект А без приращения, а сам *itsRadius в Circ увеличивался на 1. Как это реализовать?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.04.2017, 16:32 4
У вас в классе идёт работа с памятью, но при этом не объявлен явно конструктор копий и оператор копирующего присваивания.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
27.04.2017, 16:36 5
Цитата Сообщение от Antnemo Посмотреть сообщение
typedef unsigned short int USH;
- что за тип такой? Либо int, либо short.
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
27.04.2017, 16:46 6
DemolitionMan, short -- всего лишь модификатор целого типа (int). Сам тип может быть опущен, если есть хоть один из его модификаторов. То бишь, если написать unsigned short, то подразумевается unsigned short int.
1
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
27.04.2017, 16:51 7
Ну я не знаю, это наверное в другом компиляторе так. У меня в C++Builder 6: short - 16-битный тип данных;
int - 32-битный тип данных.
0
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
27.04.2017, 16:53  [ТС] 8
MrGluck, Извините за глупые вопросы, а вот это разве не явное объявление конструктора копий...

SimpleCircle(SimpleCircle &) ;//вот прототип конструктора копий

SimpleCircle :: SimpleCircle(SimpleCircle &rhs) //Конструктор - копий
{
itsRadius = new USH;
*itsRadius = rhs.GetRad();
cout << "\ncopy constructor\n ";
}
0
Велосипедист...
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
27.04.2017, 16:54 9
DemolitionMan, short -- это не тип, а его модификатор. int не всегда имеет 32 бита. Он имеет ширину не меньше 16 бит.
Скачайте более современную IDE, и почитайте вотэтавот
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.04.2017, 16:56 10
Цитата Сообщение от DemolitionMan Посмотреть сообщение
что за тип такой? Либо int, либо short.
На самом деле, short == short int. Просто полный тип можно не писать.

Добавлено через 1 минуту
Цитата Сообщение от Antnemo Посмотреть сообщение
а вот это разве не явное объявление конструктора копий...
Да, это конструктор копий. Я его не приметил среди вашей простыни. Используйте теги форматирования кода.
Оператора присваивания всё равно нет, и именно это вызывает ошибку в вашем коде.
0
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
27.04.2017, 17:17  [ТС] 11
MrGluck, Спасибо за критику, первый вопрос на этом форуме..В следующий раз постараюсь с табуляцией.

Добавлено через 16 минут
MrGluck, Вы имеете ввиду добавить это?

C++
1
2
3
4
5
6
7
8
9
10
SimpleCircle &SimpleCircle :: operator = ( SimpleCircle &rhs )  
    {
        if (this == &rhs)
        return(*this);
        delete itsRadius;
        itsRadius = new USH;
        *itsRadius = rhs.GetRad();
        return (*this);
        
    }
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.04.2017, 17:36 12
Antnemo, да, что-то типа того.
0
132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
27.04.2017, 17:40 13
Мне, кстати, профессионалы тут не советовали работать с консолью в конструкторе, хотя и видно когда какой конструктор запскается.
0
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
27.04.2017, 18:00  [ТС] 14
После добавления оператора присваивания не работает присваивание с приращением..Что-то я запутался


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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    #include <iostream>
    using namespace std;
    typedef unsigned short USH;
    
    class SimpleCircle
    {
        public:
            SimpleCircle(){itsRadius = new USH;*itsRadius = 0;
        }
            SimpleCircle(int); 
            ~SimpleCircle() { delete itsRadius;itsRadius = 0; }
            SimpleCircle(SimpleCircle &) ;
            
            SimpleCircle &operator = ( SimpleCircle &rhs ); 
            const SimpleCircle &operator ++ ();
            const SimpleCircle operator ++ (int x);
            
            
            void SetRad(USH rad);
            USH GetRad();
    
        private:
            USH *itsRadius; 
            
        
    };
    
    SimpleCircle :: SimpleCircle(int x) 
    {
        itsRadius = new USH;
        *itsRadius = x;
        
    }
    
    SimpleCircle :: SimpleCircle(SimpleCircle &rhs) 
    {
        itsRadius = new USH;
        *itsRadius = rhs.GetRad();
        cout << "\ncopy constructor\n ";
    }
    
    SimpleCircle &SimpleCircle :: operator = ( SimpleCircle &rhs )  
    {
        if (this == &rhs)
        return(*this);
        delete itsRadius;
        itsRadius = new USH;
        *itsRadius = rhs.GetRad();
        return (*this);
        
    }
    
    const SimpleCircle &SimpleCircle :: operator ++ () 
    {
        ++ (*itsRadius);
        return (*this);
    }
    
     const SimpleCircle SimpleCircle :: operator ++ (int x) 
    {
        SimpleCircle temp(*this);
        ++(*itsRadius);
        return temp;
        
    }
    
 
    void SimpleCircle :: SetRad(USH rad)
    {
        *itsRadius = rad;
    }
    
    USH SimpleCircle :: GetRad()
    {
        return (*itsRadius);
    }
    
    int main()
    {
        SimpleCircle Circ;
        Circ.SetRad(3);
        ++ Circ;
        ++ Circ;
        cout << "\n Circ = " << Circ.GetRad();
        Circ ++ ;
        cout << "\n Circ = " << Circ.GetRad();
                
        SimpleCircle A;
        Circ ++; //Значение  7
        //A = Circ++;//При попытке присваивания с приращением - ошибка..
        A = Circ;
        //A = ++Circ ;
        cout << "\n Circ = " << Circ.GetRad() << "\nAnd A = " << A.GetRad();
        
        return 0;
    }
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
27.04.2017, 18:03 15
Цитата Сообщение от Antnemo Посмотреть сообщение
: operator = ( SimpleCircle &rhs )
const SimpleCirle& rhs
1
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
27.04.2017, 18:44  [ТС] 16
Dani, спасибо, разобрался.
Косяк был где Вы сказали и тут:
USH GetRad();
Заработало с

C++
1
USH GetRad() const;
Еще вопрос, а если const стоит после функции, на что он указывает?
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
27.04.2017, 18:53 17
Цитата Сообщение от Antnemo Посмотреть сообщение
Еще вопрос, а если const стоит после функции, на что он указывает?
Если не совсем верно упростить, то это указывает на то, что метод не изменяет значений переменных-членов класса и не вызывает методов, которые могут это сделать.
0
27.04.2017, 18:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2017, 18:53
Помогаю со студенческими работами здесь

Перегрузка операторов
Ругается на операторы != и &lt; в 208 - 209 строках. На сколько я понял нужно перегрузить их. Можете...

Перегрузка операторов
Доброй ночи! Изучаю перегрузку операторов. Создал класс Дробь, где в качестве данных выступают...

Перегрузка операторов
Я тут пока изучаю перегрузку, написал следующий код: class String{ private: size_t size_;...

Перегрузка операторов
Доброго времени суток. Начал изучать основы ООП, дошел до перегрузки операторов. В программе...


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

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