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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.66
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
#1

Перегрузка "operator +" - C++

05.03.2009, 17:51. Просмотров 5957. Ответов 10
Метки нет (Все метки)

Прив, подскажите, как организовать перегрузку, чтобы работало, как надо.
У меня такая проблема
a=3 b=4
c = a+b
a=3
b=4
c=7
-----------
а в моем коде выходит что пока оно складывает оно сразу и приравнивает
a=3 b=4
c = a+b
a=7
b=4
c=7
При перегрузке + оно сразу и складывает в левой переменной а дальше она и присваивается новому значению и у меня выходит 2 переменные с одними и теме же значениями.
Соответственно я перегружаю и =
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Human& operator+(Human &h)
    {
            Human newh;
            Age += h.Age;
            return *this;
    }
 
    Human& operator=(Human &h)
    {
        Age = h.Age;
        return *this;
    }
// ...
h.Age = 200;
h1.Age = 100;
h2=(h+h1);
В результате и в h и в h2 одно и тоже.
Как его перегрузить, чтобы оно держало значение временно, а после присваивания удаляло?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 18:15     Перегрузка "operator +" #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       Human(int a):age(a)
{}
 
    Human& operator=(Human &h)
    {
        Age = h.Age;
        return *this;
    }
// ...
//функция помошник(вне класса)
    int operator+(Human &h,Human &h1)
    {
            return h.age+h1.age;
    }
h.Age = 200;
h1.Age = 100;
h2=(h+h1);
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
05.03.2009, 22:49  [ТС]     Перегрузка "operator +" #3
Вне класса - друг?
В общем сделал и методом класса и другом и в обоих случаях ошибка
main.cpp(16) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
А понял, фишка в Конструкторе... Оно неявно преобразует 13 в Human h(13)
а без этого никак? То конструкторов много выйдет почти одинаковых

Добавлено через 4 часа 16 минут 0 секунд
И все же, начал исправлять и оказалось, что оно не хочет преобразовывать число в класс... Возможно это из-за того что у меня не 1 конструктор?
Один из конструкторов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Human(int a)
    {
        Age = a;
    }
// ...
    Human& operator=(Human &h)
    {
        //strcpy(Name, h.Name);
        return *this;
    }
// ...
    friend int operator+(Human &h, Human &h2);
// ...
    int operator+(Human &h, Human &h2)
    {
        //if(!h.Female && !h2.Female)
        //  cout<<"Emmm...";
            return 2;//h.Lastname;
    }
main.cpp(16) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 23:02     Перегрузка "operator +" #4
Можно по другому,но все равно придем к тому,что нужен будет конструктор принимающий тип int

Добавлено через 10 минут 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
#include <iostream>
class Human
{
public:
    int age;
    Human(int a=0):age(a)
    {}
    Human& operator=(const Human a)
    {
        age=a.age;
        return *this;
    }
};
 
int operator+(Human& h1,Human& h2)
{
    return h1.age+h2.age;
}
 
int main()
{
    Human h1=12;
    Human h2=13;
    Human h3;
    h3=(h1+h2);
    std::cout<<h1.age<<"   "<<h2.age<<"   "<<h3.age;
    system("pause");
    return 0;
}

выводит 12 13 25
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
05.03.2009, 23:28  [ТС]     Перегрузка "operator +" #5
Что-то я не заметил большого отличия от первого кода и этого.
Ну в общем, что я понял -
h2=(h+h1);
where
(h+h1) return int
so
h2=int;
но оно начало возникать, что не как переконвертировать.
Тогда я убрал вообще перегрузку = и заработало!
h2=13;
так cout<<h2.Age; //13
а сейчас сравнил код и допер, что я тупанул
(h+h1) return int это же константа возвращается а не переменная, дописал const и стало работать с перегрузкой =.

Спасибо. Сейчас надо попробовать char сделать)

Добавлено через 12 минут 58 секунд
А как это можно организовать с ЧАР?
Я сделал тоже самое только оно возвращает указатель ЧАР.
h+h1 работает и возвращает строку
а
h2="fdfdf"; ///crash
h2='f'; //ok
как убрать ограничение только на 1 символ?
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
05.03.2009, 23:33     Перегрузка "operator +" #6
ты бы хоть код показал
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
06.03.2009, 00:08  [ТС]     Перегрузка "operator +" #7
Ну код тот же самый только вместо ИНТ - ЧАР.
Все я сделал. Просто я забыл вызвать функцию инициализации переменных и проверял если указатель не пуст то сносить его и оно крашилось на этом месте.

Добавлено через 31 минуту 24 секунды
А такой способ действует при динамическом распределении памяти?
Human *h="ddd";
чтобы выделило память под нее и присвоило значение переменной?
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
06.03.2009, 00:13     Перегрузка "operator +" #8
такой способ не действует.
Что ты хочешь получить? массив Human инициализированый строкой символов?
Если так,то это у тебя не получится
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
06.03.2009, 00:17  [ТС]     Перегрузка "operator +" #9
Просто сложение 2 элементов в 3 работает только при статических переменных, а при динамических сложение я сделал, а присвоить не могу. Пишет не может преобразовать ЧАР в Хуман*
Humanitis
172 / 164 / 6
Регистрация: 12.01.2009
Сообщений: 430
06.03.2009, 00:19     Перегрузка "operator +" #10
C++
1
Human *h=new Human("ddd");
а лучшеб ты всеж таки показал свой код
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2009, 00:44     Перегрузка "operator +"
Еще ссылки по теме:

Перегрузка оператора "++" и "--" , компилирует, но при запуске программы - ошибка C++
Класс "Матрица". Перегрузка оператора "минус" C++
C++ Класс "Дробь". Перегрузка оператора "=="
Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" C++
C++ Перегрузка операторов: "operator #"

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

Или воспользуйтесь поиском по форуму:
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
06.03.2009, 00:44  [ТС]     Перегрузка "operator +" #11
Да уже смысла нет) Я уже переделал все...
Но суть остается такая:
Human h;
h = 13; //OK если Хуман содержит конструктор
h = h1+h2; //OK если Хуман содерж конструктор а х1 и х2 возвращают нужный тип
----------------
Human *ph;
Human h = new Human(), h1 = new Human();
???
ph = new Human( h+h1);
при условии что Хуман содержит перегрузку + и возвращает указатель на чар.
Будет ли работать:?

Ладно я уже спать, завтра на ленты рано.

Добавлено через 6 минут 6 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Human( char *ln)
    {
        SetData();
        strcpy(Name, ln);
    }
 
    char * operator+( Human *h)
    {
        return h->Name;
    }
 
    Human *h = new Human("Bonni");;
    Human *h1 = new Human("Breddd");
    Human *res = new Human(*h+h1);
    res->GetData();
Выводит нужное имя
Yandex
Объявления
06.03.2009, 00:44     Перегрузка "operator +"
Ответ Создать тему
Опции темы

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