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

Перегрузка, дружественный функции - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 19:40     Перегрузка, дружественный функции #1
Всем привет сразу к делу. Вроде бы всё просто , перегрузка ... Просче показать чем объяснить. Ниже не замысловатый код, перегружены арефметические операции. И почему-то не работает ситуация когда я объект класса пытаюсь разделить на вещественное число. Ошибка во время компиляции
C++
1
Ошибка  1   error C2666: operator /: для 2 перегрузок есть подобные преобразования  d:\project_vs 2010\c++\leassons on lafore cpp file\leassons 11_6.cpp    54  1   Solutions for Lafore all leassons_
Сколько я не искал подобных перегрузок я не нашёл. В чём дело??
Вот минимальный код
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
#include<iostream>
 
class bMoney
{
private:
    long double money;//денежная переменная
public:
    bMoney():money(0.0)
    {}
    //явный конструктор преобназования long double in bMoney
    bMoney(long double);
    //вывод на экран
    void getmoney(void);
    operator long double(void);
    //дружественные функции
    friend bMoney operator/(const bMoney& val1,const bMoney& val2); 
    friend bMoney operator*(const bMoney& val1,const bMoney& val2);
};
//конструктор преобназования long double in bMoney
bMoney::bMoney(long double ldb_val)
{
    money= (ldb_val);
}
//перегрузка оператора преобразования из  bMoney in long double 
bMoney:: operator long double(void)
{
    long double ldb_result=(money);
    return (ldb_result);
}
void bMoney:: getmoney(void)
{std::cout<<money<<std::endl;}
/***********************************************************************************************/
 
int main(void)
{
    const int MAX_for_bMoney=2;
    class ::bMoney bMmas[MAX_for_bMoney],bM_rerult;
    char chquestion=NULL;
 
        chquestion=NULL;
 
 
            std::cout<<"//умножение на вещественное число"<<std::endl;
            bM_rerult=bMmas[0]*bMmas[1];
            //вывод на экран произведения
        //диление на вещественное число
            std::cout<<"//диление на вещественное число"<<std::endl;
            bM_rerult=bMmas[0]/bMmas[1];
            //вывод на экран частного
            bM_rerult.getmoney();
        //диление среди обьектов класса bMoney
            std::cout<<"//диление среди обьектов класса bMoney"<<std::endl;
/*ОШИБКА*/  bM_rerult=bMoney(bMmas[0]/43.55);
            //вывод на экран частного
            bM_rerult.getmoney();       
        //проверка на вводимый символ ответа на продолжение цикла
 
        
 
    system("pause");
return 0;
}
 
//==============================================================================================================
 
bMoney operator*(const bMoney& val1,const bMoney& val2)
{return bMoney(val1.money*val2.money);}
 
//==============================================================================================================
 
bMoney operator/(const bMoney& val1,const bMoney& val2)
{return bMoney(val1.money/val2.money);}
 
//==============================================================================================================
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2012, 19:40     Перегрузка, дружественный функции
Посмотрите здесь:

дружественный класс C++
Дружественный класс C++
Перегрузка операторной функции и функции ! C++
C++ Перегрузка (бинарный, дружественный оператор)
C++ Дружественный шаблонный класс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
13.02.2012, 19:47     Перегрузка, дружественный функции #2
Цитата Сообщение от stawerfar Посмотреть сообщение
Сколько я не искал подобных перегрузок я не нашёл. В чём дело??
Вы не перегрузили для double, и удивляетесь, почему он сам не перегрузился?
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 20:17  [ТС]     Перегрузка, дружественный функции #3
я не перегрузил его умышлено что бы вызвать не явное преобразование. Т.е. должен конпилятор не найдя перегруженной операции должен увидеть конструктор с одним оргументом т.к. ключевое слово explicit отсутствует - переменная типа long double должна быть не явно перобразована в объект класса и после этого вызваться соответствующий перегруженный метод.
Вот рабочая подобная ситуация.
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
#include<iostream>
class A
{
    int i;
public:
    
    A():i(i)
    {}
    A(int i):i(i)
    {}
    friend A operator/(const A&,const A&);
    void show()
    {std::cout<<i<<std::endl;}
};
A operator/(const A& o, const A& n)
{return(o.i/n.i);}
 
int main(void)
{   class A a(4),b(2),c;
        c = a/b;
        c.show();
        c = a/4;
        c.show();
 
        system("pause");
return 0;
}
Как можно видеть всё работает так как я описал.
Следовательно что не так в первом случае???
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
13.02.2012, 20:22     Перегрузка, дружественный функции #4
компилятор не знает, как именно ему преобразовывать. так
C++
1
bM_rerult=bMoney(bMmas[0]/bMoney(43.55));
или так
C++
1
bM_rerult=bMoney(bMmas[0].operator long double()/43.55);
для него эти преобразования равнозначны

Добавлено через 2 минуты
как вариант объявите конструктор как
C++
1
2
explicit
bMoney(long double);
и будет использован operator long double() для преобразования
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 20:26  [ТС]     Перегрузка, дружественный функции #5
retmas В ОЧЕРЕДНОЙ РАЗ БОЛЬШОЕ СПАСИБО!
Вот только если есть время не могли бы Вы по подробней объяеснить как мне в этой ситуации сохранить функционал и оставить возможность не явного преобразования?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
13.02.2012, 20:28     Перегрузка, дружественный функции #6
если нужно неявное преобразование
C++
1
bMoney(long double);
уберите
C++
1
operator long double(void);
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 20:32  [ТС]     Перегрузка, дружественный функции #7
Цитата Сообщение от retmas Посмотреть сообщение
как вариант объявите конструктор как
Не получется как только эта команда появиться в листенге, так сразу будут запрещенны все не явные преобразования(так говорит Лафоре). Что бы не быть голостловным я проверил это и моём случае не работает. Вот что говорит:
C++
1
Ошибка  1   error C2679: бинарный "/": не найден оператор, принимающий правый операнд типа "double" (или приемлемое преобразование отсутствует) d:\project_vs 2010\c++\leassons on lafore cpp file\leassons 11_6.cpp    53  1   Solutions for Lafore all leassons_
Добавлено через 2 минуты
C++
1
 operator long double(void);
Эта операция предназначена для преобразования объекта в long double. Если я её уберу то чем её заменить??
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
13.02.2012, 20:36     Перегрузка, дружественный функции #8
такая ошибка возможна, если
C++
1
2
explicit
bMoney(long double);
и нет
C++
1
operator long double(void);
если нужно неявное преобразование, либо делайте explicit конструктор и определяйте operator long double, либо конструктор не explicit, но без operator long double.
если речь не об это, покажите строку на которую компилятор ругается
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 20:44  [ТС]     Перегрузка, дружественный функции #9
Да всё работает,ты в очередной раз прав!
Вот только не понятно тогда следующее. Лафоре говорит что explicit запрещает всё не явные преобразования.
А тут что получается? Ведь я явно не переобразую static_cast<long double>(class name). Почему так произходит??
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
13.02.2012, 20:47     Перегрузка, дружественный функции #10
explicit конструктор не делает неявных преобразований. для этого используется operator long double(void);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2012, 20:48     Перегрузка, дружественный функции
Еще ссылки по теме:

Перегрузка функции C++
Вычислить функции с использованием их разложения в степенной ряд. Функции и Перегрузка функций C++
C++ Дружественные функции. Наследование. Перегрузка функции

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

Или воспользуйтесь поиском по форуму:
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
13.02.2012, 20:48  [ТС]     Перегрузка, дружественный функции #11
Спасибо!
Yandex
Объявления
13.02.2012, 20:48     Перегрузка, дружественный функции
Ответ Создать тему
Опции темы

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