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

Дружественная перегрузка оператора - C++

Восстановить пароль Регистрация
 
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
15.08.2011, 12:27     Дружественная перегрузка оператора #1
Не пойму как правильно перегрузить данный пример
а именно 35 строку
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
#include <iostream>
using namespace std;
class A  
{
private:
    int a;
public:
    A(int a=0)
    {
        this->a=a;
    }
    void Show()
    {
        cout<<a<<endl;;
    }
 
    const A & operator + (A & temp)
    {
        return a+temp.a;
    }
    const A & operator + (int b)
    {
        return a+b;
    }
};
 
void main () 
{
    A a(10);
    A b(20);
    A c=a+b;
    c.Show();
    c=a+30;
    c.Show();
    //Как правильно перегрузить данный пример
    c=40+a;
    c.Show();
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2011, 12:27     Дружественная перегрузка оператора
Посмотрите здесь:

Перегрузка оператора C++
C++ Перегрузка оператора ~
C++ Перегрузка оператора <<
C++ Перегрузка оператора ^
Перегрузка оператора *= C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.08.2011, 12:41     Дружественная перегрузка оператора #2
Для начала opertor+ должен возвращать просто A, а вы возвращаете по ссылке временный обьект, который после выхода из operator+ уничтожается, и вы получаете ссылку на не существующий обьект.
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
15.08.2011, 12:46  [ТС]     Дружественная перегрузка оператора #3
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Для начала opertor+ должен возвращать просто A, а вы возвращаете по ссылке временный обьект, который после выхода из operator+ уничтожается, и вы получаете ссылку на не существующий обьект.
Пример покажи я так не пойму
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
15.08.2011, 13:13     Дружественная перегрузка оператора #4
В вашем случаи, я бы сделал так:
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
#include <iostream>
using namespace std;
class A  
{
private:
        int a;
public:
        A(int a=0)
        {
                this->a=a;
        }
        void Show()
        {
                cout<<a<<endl;;
        }
        friend A operator+(const A &, const A &);
};
 
A operator+(const A & lhs, const A & rhs)
{
    return A(lhs.a + rhs.a);
}
 
void main () 
{
        A a(10);
        A b(20);
        A c=a+b;
        c.Show();
        c=a+30;
        c.Show();
        //Как правильно перегрузить данный пример
        c=40+a;
        c.Show();
}
Добавлено через 20 минут
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Для начала opertor+ должен возвращать просто A, а вы возвращаете по ссылке временный обьект, который после выхода из operator+ уничтожается, и вы получаете ссылку на не существующий обьект.
Ваш код откомпилировал(без 36'ой строки), он работает не пойму почему, похоже я ошибся. Хотя... компилятор выдает предупреждения:
warning C4172: returning address of local variable or temporary
warning C4172: returning address of local variable or temporary
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
15.08.2011, 14:03     Дружественная перегрузка оператора #5
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Ваш код откомпилировал(без 36'ой строки), он работает не пойму почему, похоже я ошибся. Хотя... компилятор выдает предупреждения:
warning C4172: returning address of local variable or temporary
warning C4172: returning address of local variable or temporary
потому что фактически объект не уничтожается, просто указатель стека сдвигается и память, где находится объект, считается свободной. Т.е. если туда не успеть ни чего записать, то можно прочитать значение, которое там было (есть). Но надеяться на это конечно же не стоит.
А вообще компилятор С++ в данном случае мог и не создавать объект в стеке, но раз есть предупреждение, значит все так создал

Добавлено через 8 минут
Вот такой пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void f(int *(&p)){
    int a=10;
    p=&a;
}
 
void ff(){
    int a[10];
}
 
int main(){
    int *ptr;
    f(ptr);
    //ff();
    std::cout<<*ptr<<std::endl;
    return 0;
}
поскольку после вызова ф-ции f() со стеком больше ни чего не происходило, то выводится значение a, т.е. 10. Но стоит раскоментировать вызов ff(), и уже будет выведенно другое значение (мусор), т.к. ф-ция ff() создает в стеке массив из 10 элементов, который затирает собой значение, некогда принадлежащее переменной a в ф-ции f().
Yandex
Объявления
15.08.2011, 14:03     Дружественная перегрузка оператора
Ответ Создать тему
Опции темы

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