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

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

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

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

05.03.2009, 17:51. Просмотров 6079. Ответов 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 одно и тоже.
Как его перегрузить, чтобы оно держало значение временно, а после присваивания удаляло?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2009, 17:51     Перегрузка "operator +"
Посмотрите здесь:

Перегрузка внешней функции операции "operator=" - C++
1) Возможна ли перегрузка внешней функцией операции "operator="? Чтобы скажем выполнить нечто: int = объект 2) Компилятор (mingw)...

Перегрузка "operator =" для шаблона класса - C++
как правильно перегрузить operator= для щаблона, по идее я принимаю 2 ссылки на объекты этого класса и возвращаю 1 из них ... что-то не...

Перегрузка операторов: "operator #" - C++
Здравствуйте, подскажите пожалуйста. перегрузка оператора выглядит: void operator # (int i) В учебнике Шилдт перед словом operator...

Перегрузка "operator =" - C++
Не пойму чего возвращать из operator и так и так кручусь, умом не дохожу, помогите пожалуйста String_1& String_1::operator =(String_1...

Перегрузка "opеrator =" и "{ }" для собственного класса - C++
Я пытаюсь создать класс Vector. Для задания элементов вектора хотелось бы использовать "opеrator =" и " { } ". Возможно ли...

Перегрузка оператора "+", чтобы выполнял "*" - C++
Ребят, привет всем, возник такой вопрос: возможно ли перегрузить оператор "+" так, чтоб выполнялось умножение? Например вводится...

no operator found which takes a right/left-hand operand of type "AR" - C++
Нашел на форуме исходник программы, собрал, но выдает ошибку описанную выше #include <iostream> #include <conio.h> #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 +"
Еще ссылки по теме:

Вывод строки с cout: IntelliSense: no operator "<<" matches these operands - C++
ошибку выдает 3 IntelliSense: no operator &quot;&lt;&lt;&quot; matches these operands operand types are: std::ostream &lt;&lt;...

Добавить целое число в очередь с помощью "operator <<" - C++
В общем, прочитал я статьи про очереди. Где делается с помощью конструктора,деструктора,массивов. Вот только, у меня одна загвоздка. В...

Написать перегрузку operator+() для класса "Массив" - C++
Добрый день, Подскажите, как выйти правильно из ситуации: Array&amp; Array::operator+(const Array&amp; obj) { Array temp; ...

бинарный "operator <<" имеет слишком мало параметров С++ - C++
Добрый вечер. Нужно в с++ cli сделать перегрузку &lt;&lt;. Подскажите пожалуйста, правильный синтаксис: Попытки угадать синтаксис: ...

Реализация перегрузки "operator +" для двух объектов - C++
С=A+B; Что то не получается в операторе operator+; #include &lt;iostream.h&gt; class MASS { int *num; int n; int...


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

Или воспользуйтесь поиском по форуму:
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 +"
Ответ Создать тему
Опции темы

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