Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
1

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

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

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


Вот как методы я перегрузил 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2010, 16:23
Ответы с готовыми решениями:

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

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

перегрузка функций
Создайте класс Date, который будет содержать информацию о дате (день, месяц, год). С помощью...

Перегрузка функций!
Есть такое задание: С помощью механизма перегрузки функций реализовать функции для вывода на экран...

28
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
11.10.2010, 22:09  [ТС] 21
Author24 — интернет-сервис помощи студентам
Спасибо огромное. Пойду тестировать))))))

Добавлено через 2 часа 3 минуты
Цитата Сообщение от ISergey Посмотреть сообщение
Примерно так..
C++
1
2
3
4
5
6
7
8
9
10
Subd operator + (const Subd& w, const Subd &w1){
    Subd buff(NULL, w.kol,w.god,w.ryn); 
    buff.name = new char[strlen(w.name) + strlen(w1.name) + 1];
    strcpy(buff.name, w.name);
    strcat(buff.name, w1.name);
    buff.kol += w1.kol;
    buff.god += w1.god;
    buff.ryn += w1.ryn;
    return buff;
}
Вот написал как вы предложили, выдает такую ошибку:
error C2248: Subd::kol: невозможно обратиться к private член, объявленному в классе "Subd"
(и так на каждую переменную)
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
11.10.2010, 22:40 22
В классе добавь.
C++
1
friend Subd operator + (const Subd&, const Subd &);
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
12.10.2010, 08:57  [ТС] 23
Цитата Сообщение от ISergey Посмотреть сообщение
В классе добавь.
C++
1
friend Subd operator + (const Subd&, const Subd &);
Я сразу добавил, и таки ошибки выдавал
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.10.2010, 08:59 24
Цитата Сообщение от robert19 Посмотреть сообщение
а вот "+" не получается как дружественную функцию
Что имеено не получается?
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
12.10.2010, 10:20  [ТС] 25
Ну как бы получилось. По заданию вот так правильно:
C++
1
2
3
4
5
6
7
8
9
10
Subd operator + (const Subd& w, const Subd &w1){
        Subd buff(NULL, w.kol,w.god,w.ryn); 
        buff.name = new char[strlen(w.name) + strlen(w1.name) + 1];
        strcpy(buff.name, w.name);
        strcat(buff.name, w1.name);
        buff.kol += w1.kol;
        buff.god += w1.god;
        buff.ryn += w1.ryn;
        return buff;
}
В классе вот так объявил:
C++
1
2
3
...
friend Subd operator + (const Subd&, const Subd &);
...
Но все равно выдает ошибки:
Цитата Сообщение от robert19 Посмотреть сообщение
Вот написал как вы предложили, выдает такую ошибку:
error C2248: Subd::kol: невозможно обратиться к private член, объявленному в классе "Subd"
(и так на каждую переменную)
Добавлено через 5 минут
А если написать вот так:
C++
1
2
3
...
friend Subd operator + (Subd& w,const Subd w1);
...
C++
1
2
3
4
5
6
7
Subd operator + (Subd& w,const Subd w1){
        strcat(w.name, w1.name);
        w.kol = w.kol + w1.kol;
        w.god = w.god + w1.god;
        w.ryn = w.ryn + w1.ryn;
        return Subd(w.name,w.kol,w.god,w.ryn);
}
То работает, но вылазит ошибка:
Цитата Сообщение от robert19 Посмотреть сообщение
Дак эту строку нельзя удалять, потому что функция должна быть дружественной, так в задании сказано.
Я вот написал вот так, вроде работает, но что то там не так потому, что, когда программа отрабатывает, консольное окно должно само закрываться, а у меня этого не происходит. Приходится самому.
Добавлено через 1 час 11 минут
Все парни я нашел свои ошибки))) Нужно было просто убрать '&' в этой функции и в объявлении)))
0
72 / 71 / 8
Регистрация: 04.08.2010
Сообщений: 434
12.10.2010, 10:21 26
Вообще тут дружественная функция не нужна\
Но раз нужно, то сейчас исправлю

Добавлено через 24 секунды
Ну раз получилось) Грац
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.10.2010, 10:31 27
Цитата Сообщение от ISergey Посмотреть сообщение
friend Subd operator + (const Subd&, const Subd &);
эта версия должна быть не членом, а другом. Другом должен быть, например, оператор левого умножения вектора на скаляр:
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
class TVector
{
 public:
 double x;
 double y;
 double z;
 TVector ();
 TVector (const  TVector&);
 TVector operator + (TVector);
 TVector operator - (TVector);
 TVector operator * (double);
 TVector operator / (double);
 TVector operator += (TVector);
 TVector operator -= (TVector);
 TVector operator *= (double);
 TVector operator /= (double);
 friend  TVector operator  (double , TVector&);
 TVector operator == (TVector);
 TVector operator != (TVector);
 TVector operator >= (TVector);
 TVector operator <= (TVector);
 TVector operator > (TVector);
 TVector operator < (TVector);
 TVector operator = (TVector);
};
, а если первый операнд имеет тип того класса, в котором объявлен оператор, то он вполне может быть неявным.
0
29 / 29 / 7
Регистрация: 26.03.2010
Сообщений: 305
12.10.2010, 11:36  [ТС] 28
Что то я смыла вашего не понял
Ну моя программа ведь правельно терь работает? И она же дружественная?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
12.10.2010, 11:47 29
Смысл в том, что так делать не надо, а если придерживаться правила: операторы-друзья только с отличным от каждого данного класса типом первого параметра, то потом легче будет отличать их от остальных операторов и не будешь гадать, почему не доступны члены первого операнда.
0
12.10.2010, 11:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2010, 11:47
Помогаю со студенческими работами здесь

Перегрузка функций
С помощью механизма перегрузки функций организовать ввод с клавиатуры и сцепление: 1) одной строки...

Перегрузка функций с++
Задача состоит в том, чтобы написать перегуженную функцию и то, что будет её вывзывать в...

Перегрузка функций с++
Прошу помочь в решении задачи: Написать перегруженные функции и основную программу, которая их...

перегрузка функций
Помогите: как изменится поле private, когда мы делаем перегрузку функции? Функция заполняет массив...


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

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