Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
11 / 11 / 3
Регистрация: 14.01.2011
Сообщений: 113

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

15.08.2011, 12:27. Показов 1975. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не пойму как правильно перегрузить данный пример
а именно 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();
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2011, 12:27
Ответы с готовыми решениями:

Дружественная перегрузка
Как это задание переделать,чтобы использовалась обычная и дружественная перегрузка ...

Дружественная функция и перегрузка
Есть обьявление дружественной функции класу Person: // Person.h friend istream &amp; operator&gt;&gt;(istream &amp; is, const Person &amp; p);...

Перегрузка оператора
Всем доброго времени суток!Помогите пожалуйста! Перегрузил оператор умножения матрицы на число, но не могу перегрузить оператор умножения...

4
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
15.08.2011, 12:41
Для начала opertor+ должен возвращать просто A, а вы возвращаете по ссылке временный обьект, который после выхода из operator+ уничтожается, и вы получаете ссылку на не существующий обьект.
1
11 / 11 / 3
Регистрация: 14.01.2011
Сообщений: 113
15.08.2011, 12:46  [ТС]
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Для начала opertor+ должен возвращать просто A, а вы возвращаете по ссылке временный обьект, который после выхода из operator+ уничтожается, и вы получаете ссылку на не существующий обьект.
Пример покажи я так не пойму
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
15.08.2011, 13:13
В вашем случаи, я бы сделал так:
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
1
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
15.08.2011, 14:03
Цитата Сообщение от 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().
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2011, 14:03
Помогаю со студенческими работами здесь

Перегрузка оператора ->
обясните пожалуйста как перегружать -&gt; и для чего это нужно

Перегрузка оператора =
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=(...

Перегрузка оператора +
Всем привет, проблема на этот раз такая. Для того, чтобы выучить классы, я пишу некое подобие класса string. Сложность вот в чем. Возникла...

Перегрузка оператора ()
кто может подсказать как создать перегрузку что бы можно было работать с амссивввом в таком ввиде mass(3)=2 а не mass=2; если можно...

Перегрузка оператора -
Стою я на асфальте в лыжи обутый... В чём проблема, задача перегрузить операторы, всё, что я проверял работает исправно, кроме минуса,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru