Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
1

Перегрузка + и -

03.04.2013, 10:55. Показов 1041. Ответов 15
Метки нет (Все метки)

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
#include "StdAfx.h"
 
class resistor {
    public:
        double nom;     
        char bit;       
        char A_line;    
        char B_line;
        int kolvo;
 
    resistor( double n1 ,char b1 , char l_a1 , char l_b1 , int k1 ) {
        nom = n1;
        bit = b1;
        A_line = l_a1;
        B_line = l_b1;
        kolvo = k1;
    }
 
    int resistor::operator + (int added ){
        
        kolvo += added;
        return kolvo;
    }
     int resistor::operator - (int added ) {
          
        kolvo -= added;
        if (kolvo < 0 ) kolvo = 0;
        return kolvo;
    }
};
Как правильно перегрузить оператор + и - так, чтобы можно было писать так

resistor item ...

item + 15 ;// Здесь оператор + должен прибавить число к переменной kolvo

В моем случае ругается
error C2679: бинарный "+": не найден оператор, принимающий правый операнд типа "resistor *" (или приемлемое преобразование отсутствует)

Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2013, 10:55
Ответы с готовыми решениями:

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

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг...

Перегрузка new
Дайте примеры на перегрузку. #define n ... // Некая целая константа class a { ... }; // Некий...

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

15
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.04.2013, 11:25 2
C++
1
2
3
4
5
6
    resistor resistor::operator+(int added ){
        return resistor(nom,bit,A_line,B_line,kolvo+added);
    }
    resistor resistor::operator-(int added ){
        return resistor(nom,bit,A_line,B_line,kolvo-added);
    }
0
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 11:29  [ТС] 3
error C2679: бинарный "+": не найден оператор, принимающий правый операнд типа "resistor *" (или приемлемое преобразование отсутствует)
1> может быть "встроенный оператор C+++(volatile const System::Object ^, volatile const System::String ^)"
1> или "встроенный оператор C+++(volatile const System::String ^, volatile const System::Object ^)"
1> или "встроенный оператор C+++(volatile const System::String ^, volatile const System::String ^)"
1> при попытке сопоставить список аргументов "(System::String ^, resistor *)"

Это если просто писать item +15
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.04.2013, 11:36 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
#include <iostream> 
 
class resistor {
    public:
        double nom;     
        char bit;       
        char A_line;    
        char B_line;
        int kolvo;
 
    resistor( double n1 ,char b1 , char l_a1 , char l_b1 , int k1 ) {
        nom = n1;
        bit = b1;
        A_line = l_a1;
        B_line = l_b1;
        kolvo = k1;
    }
};
    resistor operator+(const resistor & r,const int added ){
        return resistor(r.nom,r.bit,r.A_line,r.B_line,r.kolvo+added);
    }
    resistor operator-(const resistor & r,const int added ){
        return resistor(r.nom,r.bit,r.A_line,r.B_line,r.kolvo-added);
    }
int main(){
    resistor r(10,'a','b','c',14);
    std::cout<<"R = "<<r.kolvo<<std::endl;
    std::cout<<"R + 10 ="<<(r+10).kolvo<<std::endl;
    std::cout<<"R - 5 ="<<(r-5).kolvo<<std::endl;
    std::cout<<"R = "<<r.kolvo<<std::endl;
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 11:37 5
Код покажите, по поводу которого ошибки пишутся.
0
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 11:52  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
5
6
#include <iostream> 
    resistor r(10,'a','b','c',14);
    std::cout<<"R + 10 ="<<(r+10).kolvo<<std::endl;
    std::cout<<"R - 5 ="<<(r-5).kolvo<<std::endl;
    std::cout<<"R = "<<r.kolvo<<std::endl;
}
Я имел ввиду обращение просто r+10.
(r+10).kolvo раносильно r->kolvo +10 (Windows Form) , что выполняется и без перегрузки

C++
1
2
3
4
resistor* item = new resistor ( 2.2 ,'5' , 'A' , 'l', 10 );
            int o = item->kolvo + 15 ;
            MessageBox::Show("item += 15\n" + (item->kolvo + 15));
            //MessageBox::Show("item - 105\n" + (item - 105));// Здесь ошибка
Возможно перегрузка в таком виде как я хочу и невозможна вовсе.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 12:14 7
Цитата Сообщение от ящюр Посмотреть сообщение
//MessageBox::Show("item - 105\n" + (item - 105));// Здесь ошибка
Ошибка здесь, скорее всего, из-за того, что item указатель. Если так:
C++
1
MessageBox::Show("item - 105\n" + (*item - 105));
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.04.2013, 12:23 8
Цитата Сообщение от ящюр Посмотреть сообщение
error C2679: бинарный "+": не найден оператор, принимающий правый операнд типа "resistor *" (или приемлемое преобразование отсутствует)
15 - это int.

Добавлено через 1 минуту
Цитата Сообщение от ящюр Посмотреть сообщение
int resistor::operator + (int added ){
А где декларация? Внутри фигурных скобок класса напиши:
C++
1
int operator + (int added );
.
0
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 12:32  [ТС] 9
Цитата Сообщение от taras atavin Посмотреть сообщение
15 - это int.

Добавлено через 1 минуту
А где декларация? Внутри фигурных скобок класса напиши:
C++
1
int operator + (int added );
.
Всё что есть в классе - в первом посте.

P.S.До этого писал на Андроиде и постоянно ловлю себя на том, что так и продолжаю писать не нем ( в плане синтаксиса) поэтому вариант того, что что-то забыл очень велик. С++ начал изучать месяца 2 назад.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.04.2013, 12:33 10
Цитата Сообщение от ящюр Посмотреть сообщение
Я имел ввиду обращение просто r+10
Оно должно возвращать временный объект, у которого и спрашиваем kolvo.
для изменения текущего есть еще +=
Цитата Сообщение от ящюр Посмотреть сообщение
раносильно r->kolvo +10 (Windows Form)
ну тогда и писать нужно было в соответствующий раздел, а не в C++
0
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 12:34  [ТС] 11
Цитата Сообщение от Croessmah Посмотреть сообщение

ну тогда и писать нужно было в соответствующий раздел, а не в C++
А Windows Form это не С++ ?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
03.04.2013, 12:36 12
Цитата Сообщение от ящюр Посмотреть сообщение
А Windows Form это не С++ ?
C++/CLI и C++ - это разные языки.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
03.04.2013, 12:58 13
А, так это внутри? Тогда выкинь resistor::.
0
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 21:22  [ТС] 14
В общем имел ввиду вот это:
файл base.cpp:
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
class resistor {
    public:
        double nom;     // Номинал
        char bit;       // Включает в себя res,dop,wat побитно
        char A_line;    // Местоположение в стелаже
        char B_line;
        int kolvo;      // Количество
 
 
 
    
    resistor( double n1 ,char b1 , char l_a1 , char l_b1 , int k1 ) {
        nom = n1;
        bit = b1;
        A_line = l_a1;
        B_line = l_b1;
        kolvo = k1;
    }
 
    int plus (int added ){
        
        kolvo += added;
        return kolvo;
    }
     
};
Обращение к функции из Form1.h

resistor *item = new resistor ( 2.2 ,'5' , 'A' , 'l', 10 );
item->plus(90);
// Функция прибавляет число к переменной kolvo и возвращает её значение
.....

Может и реализовано через Ж, но работает
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 23:33 15
Ещё раз повторю, что эта ошибка:
Цитата Сообщение от ящюр Посмотреть сообщение
В моем случае ругается
error C2679: бинарный "+": не найден оператор, принимающий правый операнд типа "resistor *" (или приемлемое преобразование отсутствует)
по поводу того, что:
Цитата Сообщение от alsav22 Посмотреть сообщение
Ошибка здесь, скорее всего, из-за того, что item указатель. Если так:
C++
1
MessageBox::Show("item - 105\n" + (*item - 105));
Других ошибок у меня компилятор не выдаёт.
1
114 / 112 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
03.04.2013, 23:36  [ТС] 16
Спасибо всем кто откликнулся. Скорее всего обойдусь без перегрузки, мой рабочий вариант меня пока устроил.
0
03.04.2013, 23:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2013, 23:36
Помогаю со студенческими работами здесь

Перегрузка.
Всем привет. Вот, попросили помочь, кому не сложно. Сам код: #ifndef OTREZOK_H #define...

Перегрузка *
Есть такой класс: class CMatrix{ valarray&lt;valarray&lt;double&gt; &gt; matrix; public: CMatrix...

перегрузка []
Как перегрузить operator так, чтобы когда я модифицировал массив то вызывалась простая версия, а...

Перегрузка <<
Заинтересовала конструкция , использованная как перегрузка оператора &quot;&lt;&lt;&quot; для вывода записей,...


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

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