Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

Перегрузка функций - C++

11.10.2010, 16:23. Просмотров 1364. Ответов 28
Метки нет (Все метки)

Здравствуйте уважаемые програмисты
У меня вот такое задание:
В классе необходимо перегрузить нижеследующие операции, при этом две функции-операции должны быть реализованы как методы класса, а одна – как дружественная функция:
• Присваивание «=»;
• Сложение (в случае символьных полей сложение понимается как конкатенация) «+»;
• Соответствие (равенство) «==».


Вот как методы я перегрузил 2 функции, а вот "+" не получается как дружественную функцию(пробовал в функции которая закоментирована), может кто помочь?

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream> 
#include <string.h>
#include <iostream>
 
using namespace std;
 
class Subd{
    private:
        char* name;
        int kol;
        unsigned int god;
        float ryn;
    public:
        Subd(char* name=NULL,int kol=0,unsigned int god=0,float ryn=0);
        Subd (Subd&);
        void showSubd();
        ~Subd(){
            if (name)
            delete [] name;
        };
        int operator == (Subd&);
        Subd& operator =(Subd&);
        friend int operator + (Subd&, Subd&);
};
 
Subd::Subd(char* emp_name,int emp_kol,unsigned int emp_god,float emp_ryn){
    if (emp_name){
        name = new char [strlen(emp_name)+1];
        strcpy(name,emp_name);
    }
    else{
        name = NULL;
    }
    kol=emp_kol; god=emp_god; ryn=emp_ryn;
}
 
Subd::Subd(Subd& w){
    if (w.name){
        name = new char [strlen(w.name)+1];
        strcpy(name,w.name);
    }
    else name = NULL;
 
    kol=w.kol;
    god=w.god;
    ryn=w.ryn;
}
 
void Subd::showSubd(){
    cout << "Название фирмы:            " << name << endl; 
    cout << "Количество продуктов:      " << kol<< endl; 
    cout << "Годовой объем продажи ($): " << god << endl;
    cout << "Часть рынка (%):       " << ryn << endl;
}
 
int Subd::operator == (Subd& w){
        if ((strcmp(name,w.name) != 0)||
            (kol != w.kol)||
            (god != w.god)||
            (ceil(ryn) != ceil(w.ryn)))
            return 0; //ложь
        else
            return 1; //истина
}
 
Subd& Subd::operator=(Subd& w){
    if (&w == this) return *this;
    if (name) delete [] name;
    if (w.name){
        name = new char [strlen(w.name)+1];
        strcpy(name,w.name);
    }
    else name = NULL;
 
    kol=w.kol;
    god=w.god;
    ryn=w.ryn;
    return *this;
}
/*
int operator + (Subd& w, Subd& w1){
    strcat(w.name, w1.name);
    w.kol = + w1.kol;
    w.god = + w1.god;
    w.ryn = + w1.ryn;
}
*/
int main(){
    setlocale(LC_ALL,"Russian");
    cout << "Фирмы - производители СУБД"<<endl;
    cout<<endl;
    Subd w("Oracle",1,2488000000,31.1);
    w.showSubd();
    cout<<endl<<endl;
    Subd w1("IBM",3,2392000000,29.9);
    w1.showSubd();
    cout<<endl<<endl;
    Subd w2("Microsoft",2,1048000000,13.1);
    w2.showSubd();
    cout<<endl;
    if (w == w1) cout<<"Фирмы Oracle и IBM работают одинакого.";
    else cout<<"Фирмы Oracle и  IBM       работают по разному."<<endl;
    if (w == w2) cout<<"Фирмы Oracle и Microsoft работают одинакого.";
    else cout<<"Фирмы Oracle и  Microsoft работают по разному."<<endl;
    if (w1 == w2) cout<<"Фирмы IBM и Microsoft работают одинакого.";
    else cout<<"Фирмы IBM    и  Microsoft работают по разному."<<endl;
    cout<<endl;
    Subd w3;
    w3=w2;
    w3.showSubd();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2010, 16:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка функций (C++):

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

Перегрузка функций. Реализация функций - C++
Разработать функцию f(x) , которая возвращает младшую цифру натурального числа x . Вычислить с ее помощью значение выражения z= f(a) +...

Перегрузка функций - C++
Моя последняя лаба=( Светлые умы, помогите... Выполнить задания пятой и шестой лабораторной работы, оформив каждый пункт задания в виде...

Перегрузка функций - C++
АТД - множество с элементами типа int. Дополнительно перегрузить следующие операции: «+» - добавить элемент в множество(типа int +...

Перегрузка функций - C++
Для одномерного массива из n вещественных элементов и од*номерного массива из n строк, найти соответственно: 1.1. Максимальный по модулю...

перегрузка функций - C++
У меня есть структура Студенты. в ней есть Имя студента, его Бал аттестата и Возраст. Подскажите, плиз, как создать функцию add(); и...

28
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 16:30 #2
C++
1
2
3
4
5
6
Subd operator + (Subd& w1){
        strcat(name, w1.name);
        kol = + w1.kol;
        god = + w1.god;
        ryn = + w1.ryn;
        return Subd(name,kol,god,ryn)
Приблизительно так,
Это при сложении 2-х обьектов типа Subd (первый вызывает оператор +, а второй передается в функцию)

Добавлено через 1 минуту
Отдельная история, когда нужно перегрузить операцию + для:
базовый тип + пользовательский (тут уже дружественные функции и конструкторы перевода из базового типа в пользовательский)
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 16:34  [ТС] #3
Блин, когда я пишу так как вы предложили, то у меня выдает ошибки что типо "name,kol,god,ryn" - error C2065: ****: необъявленный идентификатор
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 16:37 #4
Нужно указать что функция принадлежит к классу : Subd::Subd operator + (Subd& w1)
а не просто Subd operator + (Subd& w1)
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 16:37  [ТС] #5
К функции "+" прилагалось еще вот такое пояснение:
friend Сhurch operator + (Сhurch&, Сhurch&);
Оператор + необходимо перегрузить способом, аналогичным своему традиционному арифметическому использованию. Поэтому важно, чтобы ни один из операндов не менялся. Например, когда вы складываете 10+4, результат равен 14, но ни 10, ни 4 не меняются. Таким образом, внутри функции необходим временный объект для хранения результата.
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 16:40  [ТС] #6
Цитата Сообщение от LineStown Посмотреть сообщение
Нужно указать что функция принадлежит к классу : Subd::Subd operator + (Subd& w1)
а не просто Subd operator + (Subd& w1)
Что то не канает((
Вот так писал:

C++
1
2
3
4
5
6
7
Subd::Subd operator + (Subd& w){
    strcat(name, w.name);
    kol = + w.kol;
    god = + w.god;
    ryn = + w.ryn;
    return Subd(name,kol,god,ryn);
}
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 16:41 #7
на что ругается?
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 16:43  [ТС] #8
Цитата Сообщение от LineStown Посмотреть сообщение
на что ругается?
error C2040: operator +: "int (Subd &)" отличается по уровням косвенного обращения от "Subd &(Subd &)"
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 16:45 #9
так нашел проблемы)
1.
правильная функция:
C++
1
2
3
4
5
6
7
Subd Subd::operator + (Subd& w){
        strcat(name, w.name);
        kol = + w.kol;
        god = + w.god;
        ryn = + w.ryn;
        return Subd(name,kol,god,ryn);
}
2.Обьявить функцию в классе нужно
C++
1
2
3
4
Subd Subd::operator + (Subd& w);\\вот тут
                int operator == (Subd&);
                Subd& operator =(Subd&);
                friend int operator + (Subd&, Subd&);
компилится нормально, но правильность не проверял
0
ISergey
Maniac
Эксперт С++
1391 / 902 / 55
Регистрация: 02.01.2009
Сообщений: 2,695
Записей в блоге: 1
11.10.2010, 16:51 #10
PS. не забываем про const дабы было меньше проблем.
C++
1
2
3
4
5
6
7
...
Subd(const char*,int, unsigned ,float);
Subd (const Subd&);
...
Subd& operator = (const Subd&);
...
Subd::Subd operator + (const Subd& w)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Subd{
...
     Subd operator + (const Subd&); // Этому оператору не нужно модифицировать данные класса
    // т.к. это будет немного странно 
    // Subd a, b, c;
    // a = b + c; // a и b изменятся.. (а нужно только а)
};
 
Subd::Subd operator + (const Subd& w){
       ; strcat(name, w.name);
       ; kol = + w.kol;
       ; god = + w.god;
       ; ryn = + w.ryn;
 
        std::string buff(name);
        buff += w.name;
        return Subd(buff.c_str(),kol + w.kol, god + w.god, ryn + w.ryn);
}
1
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 17:00  [ТС] #11
Блин, в классе объявил так:
C++
1
2
3
4
5
6
...
        Subd operator + (const Subd&);
        int operator == (Subd&);
        Subd& operator = (Subd&);
        friend Subd operator + (Subd&);
...
Дальше:
C++
1
2
3
4
5
6
7
Subd operator + (Subd& w){
    strcat(name, w.name);
    kol = + w.kol;
    god = + w.god;
    ryn = + w.ryn;
    return Subd(name,kol,god,ryn);
}
И все равно ругается (на все переменные): необъявленный идентификатор
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 17:01 #12
Внимательнее смотрите
C++
1
2
3
4
5
6
7
Subd Subd::operator + (Subd& w){
        strcat(name, w.name);
        kol = + w.kol;
        god = + w.god;
        ryn = + w.ryn;
        return Subd(name,kol,god,ryn);
}
0
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 17:06  [ТС] #13
Цитата Сообщение от LineStown Посмотреть сообщение
Внимательнее смотрите
C++
1
2
3
4
5
6
7
Subd Subd::operator + (Subd& w){
        strcat(name, w.name);
        kol = + w.kol;
        god = + w.god;
        ryn = + w.ryn;
        return Subd(name,kol,god,ryn);
}
Ужас какой то, вот что вылезло))): error C2511: Subd Subd::operator +(Subd &): перегруженная функция-член не найдена в "Subd"
0
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
11.10.2010, 17:10 #14
Описание так: Subd Subd::operator +(Subd &)
или так : Subd Subd::operator +(Subd& w)?

Добавлено через 1 минуту
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <string.h>
#include <iostream>
 
using namespace std;
 
class Subd{
        private:
                char* name;
                int kol;
                unsigned int god;
                float ryn;
        public:
                Subd(char* name=NULL,int kol=0,unsigned int god=0,float ryn=0);
                Subd (Subd&);
                void showSubd();
                ~Subd(){
                        if (name)
                        delete [] name;
                };
                Subd Subd::operator + (Subd& w);
                int operator == (Subd&);
                Subd& operator =(Subd&);
                friend int operator + (Subd&, Subd&);
};
 
Subd::Subd(char* emp_name,int emp_kol,unsigned int emp_god,float emp_ryn){
        if (emp_name){
                name = new char [strlen(emp_name)+1];
                strcpy(name,emp_name);
        }
        else{
                name = NULL;
        }
        kol=emp_kol; god=emp_god; ryn=emp_ryn;
}
 
Subd::Subd(Subd& w){
        if (w.name){
                name = new char [strlen(w.name)+1];
                strcpy(name,w.name);
        }
        else name = NULL;
 
        kol=w.kol;
        god=w.god;
        ryn=w.ryn;
}
 
void Subd::showSubd(){
        cout << "Название фирмы:                        " << name << endl; 
        cout << "Количество продуктов:          " << kol<< endl; 
        cout << "Годовой объем продажи ($):     " << god << endl;
        cout << "Часть рынка (%):               " << ryn << endl;
}
 
int Subd::operator == (Subd& w){
                if ((strcmp(name,w.name) != 0)||
                        (kol != w.kol)||
                        (god != w.god)||
                        (ceil(ryn) != ceil(w.ryn)))
                        return 0; //ложь
                else
                        return 1; //истина
}
 
Subd& Subd::operator=(Subd& w){
        if (&w == this) return *this;
        if (name) delete [] name;
        if (w.name){
                name = new char [strlen(w.name)+1];
                strcpy(name,w.name);
        }
        else name = NULL;
 
        kol=w.kol;
        god=w.god;
        ryn=w.ryn;
        return *this;
}
Subd Subd::operator + (Subd& w){
        strcat(name, w.name);
        kol = + w.kol;
        god = + w.god;
        ryn = + w.ryn;
        return Subd(name,kol,god,ryn);
}
int main(){
        setlocale(LC_ALL,"Russian");
        cout << "Фирмы - производители СУБД"<<endl;
        cout<<endl;
        Subd w("Oracle",1,2488000000,31.1);
        w.showSubd();
        cout<<endl<<endl;
        Subd w1("IBM",3,2392000000,29.9);
        w1.showSubd();
        cout<<endl<<endl;
        Subd w2("Microsoft",2,1048000000,13.1);
        w2.showSubd();
        cout<<endl;
        if (w == w1) cout<<"Фирмы Oracle и IBM работают одинакого.";
        else cout<<"Фирмы Oracle и  IBM       работают по разному."<<endl;
        if (w == w2) cout<<"Фирмы Oracle и Microsoft работают одинакого.";
        else cout<<"Фирмы Oracle и  Microsoft работают по разному."<<endl;
        if (w1 == w2) cout<<"Фирмы IBM и Microsoft работают одинакого.";
        else cout<<"Фирмы IBM    и  Microsoft работают по разному."<<endl;
        cout<<endl;
        Subd w3;
        w3=w2;
        w3.showSubd();
}
Полная компилирующаяся задача

Добавлено через 21 секунду
Только const не добавлял
1
robert19
26 / 26 / 3
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 17:18  [ТС] #15
Подписал все что не хватало в моей проге, но выдавал ошибку. Удалил все, вставил ваш код. все тип-топ. Создал переменную:
C++
1
2
Subd w4;
w4 = w1+w2;
Подчеркнул красным цветом + : Существует несколько параметров +, соответсвтвующим этим операндам.
0
11.10.2010, 17:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2010, 17:18
Привет! Вот еще темы с ответами:

Перегрузка функций - C++
Стало интересно из-за возможна перегрузка функций в программе на языке С++, с чем это связано, как реализовано внутри программы? Кто...

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

Перегрузка функций - C++
разработайте две версии функции F,заголовки которых выглядят следующим образом: 1) float F(float х); 2) void F (float x, float &amp;y); ...

Перегрузка функций - C++
Добрый вечер) очень нужна помощь нужно решить задачу, все решила, кроме одного пункта. создать класс окружность (okr) ....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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