Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] перегрузка операторов, для собственного класса 
V
    Опции темы
DeathKnight
Дата 13.9.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



есть класс для работы с деньгами.
вот объявление:
Код

class bMoney
{    
    double money;
    public:
        bMoney():money(0.0)
        {};
        bMoney(double);
        
        friend bMoney operator+(bMoney &, bMoney &);
        friend bMoney operator-(bMoney &, bMoney &);
        friend bMoney operator*(bMoney &, double);
        friend bMoney operator/(bMoney &, double);
        void Setmoney(double x);
        double Getmoney();
        friend bMoney operator*(double, bMoney &);
        friend double operator/(double, bMoney &);
        friend ostream& operator<<(ostream &stream, bMoney &obj);
        friend istream& operator>>(istream &stream, bMoney &obj);
};



реализация:
Код

#include "bmoney.h" // class's header file
#include <iostream>
#include <ios>

using namespace std;

void bMoney::Setmoney(double x)
{
    money = x;
}
double bMoney::Getmoney()
{
    return money;
}

bMoney::bMoney(double x)
{
    money=x;
}

bMoney operator+(bMoney &obj, bMoney &ob)
{
    return bMoney(obj.money + ob.money);
}

bMoney operator-(bMoney &obj, bMoney &ob)
{
    return bMoney(obj.money - ob.money);
}

bMoney operator*(bMoney &obj, double k)
{
    return bMoney(obj.money*k);
}

bMoney operator/(bMoney &obj, double k)
{
    return bMoney(obj.money/k);
}

double operator/(double k, bMoney &obj)
{
    return k/obj.Getmoney();
}

bMoney operator*(double k, bMoney &obj)
{
    return bMoney(k*obj.Getmoney());
}

double operator/(double k, bMoney obj)
{
    return k/obj.Getmoney();
}

ostream& operator<<(ostream& stream, bMoney &obj)
{
    // cout.ios::precision(2);
    cout << "$" << obj.money;
    return stream;
}

istream& operator>>(istream& stream, bMoney &obj)
{
    stream>>obj.money;
    return stream;
}


и вот такой пример использования:
Код

        cout << m1+m2 << endl;


линковщик выдает ошибку, хотя при след. примере все работает
Код

        m3=m1+m2;
        cout << m3 << endl;


собственно вопрос, почему не работает?
вроде бы все операторы перегружены
PM   Вверх
zim22
Дата 13.9.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(DeathKnight @  13.9.2009,  14:18 Найти цитируемый пост)
собственно вопрос, почему не работает?

у меня работает (MSVC 2008)

Это сообщение отредактировал(а) zim22 - 13.9.2009, 19:46


--------------------
PM MAIL   Вверх
DeathKnight
Дата 13.9.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



Код

cout << m1+m2 << endl;


на эту строчку выдает следующее
Код

 note C:\Dev-Cpp\include\c++\3.4.2\bits\ostream.tcc:63 candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&(*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] 


и т.д.
PM   Вверх
zim22
Дата 13.9.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



вот решение проблемы:
ostream& operator<<(ostream& stream, const bMoney &obj)

а вот моё объяснение: (если ошибочное, то эксперты меня поправят)
компилятор не мог найти подходящий оператор<<
т.к. здесь
Код

cout << m1+m2 << endl;

в результате сложения m1 и m2 создавался временный объект, который потом мы пытались передать по ссылке.
ostream& operator<<(ostream& stream, bMoney &obj)

но на временный объект ссылаться  можно только с помощью константной ссылки




--------------------
PM MAIL   Вверх
DeathKnight
Дата 14.9.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 12.10.2007
Где: Минск

Репутация: нет
Всего: нет



спасибо, похоже именно так и есть.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0903 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.