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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка операторов, Перегрузка операторов 
:(
    Опции темы
likenix
Дата 16.10.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!

Помогите разобраться с перегрузкой операторов. 
Хочу реализовать класс который будет представлять тип double с определенной точностью. Еще нужна возможность преобразования в тип int и double.

Код

template <unsigned int precision>
class SDouble
{
public:
    // uninitialized
    SDouble ();
    // construction
    SDouble (double fX);
    SDouble (int fX);
    //copy constructor
    SDouble (const SDouble& rkSD);
    
    // assignment
    inline SDouble& operator= (const SDouble&);
    
    // comparison
    bool operator== (const SDouble&) const;
    bool operator!= (const SDouble&) const;
    bool operator<  (const SDouble&) const;
    bool operator<= (const SDouble&) const;
    bool operator>  (const SDouble&) const;
    bool operator>= (const SDouble&) const;
    
    //unary operations
    inline SDouble operator-() const;
    inline SDouble operator+() const;
    
    //arithmetic operations
    inline SDouble operator+ (const SDouble&) const;
    inline SDouble operator- (const SDouble&) const;
    inline SDouble operator* (const SDouble&) const;
    inline SDouble operator/ (const SDouble&) const;
    
    // arithmetic updates
    inline SDouble& operator+= (const SDouble&);
    inline SDouble& operator-= (const SDouble&);
    inline SDouble& operator*= (const SDouble&);
    inline SDouble& operator/= (const SDouble&);
    
    //arithmetic operations 
    template <unsigned int precision>
    friend SDouble<precision> operator+ (double s_value, const SDouble<precision>&);
    template <unsigned int precision>
    friend SDouble<precision> operator- (double s_value, const SDouble<precision>&);
    template <unsigned int precision>
    friend SDouble<precision> operator* (double s_value, const SDouble<precision>&);
    template <unsigned int precision>
    friend SDouble<precision> operator/ (double s_value, const SDouble<precision>&);
    
    //type cast
    operator int();
    operator double();
    
    //value
    double getValue() const;
private:
    
    double supp_val_precision(double) const;
    
private:
    double m_Value;
};


При попытке выполнить код:

Код

    SDouble<4> sd(7.12);
    SDouble<4> sdr =-sd + 5.0;


Получаю:

Код

1>d:\programming\freelance\mathematic_library\release\my_new_library001\my_new_library\main.cpp(443) : error C2666: 'SDouble<degree>::operator +' : 3 overloads have similar conversions
1>        with
1>        [
1>            degree=4
1>        ]
1>        d:\programming\freelance\mathematic_library\release\my_new_library001\my_new_library\sdouble.hpp(39): could be 'SDouble<degree> SDouble<precision>::operator +(const SDouble<precision> &) const'
1>        with
1>        [
1>            precision=4
1>        ]
1>        or       'built-in C++ operator+(int, double)'
1>        or       'built-in C++ operator+(double, double)'
1>        while trying to match the argument list '(SDouble<precision>, double)'
1>        with
1>        [
1>            precision=4
1>        ]


PM MAIL   Вверх
baldina
Дата 16.10.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

//type cast
operator int();
operator double();


убери это, компилятор путается что во что преобразовывать
PM MAIL   Вверх
likenix
Дата 16.10.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina, я тоже догадался что он путается
но мне нужны операции типа double s = SDouble<2>(3.44) или int s = SDouble<2>(3)
PM MAIL   Вверх
Nikituki
Дата 16.10.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(likenix @  16.10.2009,  14:27 Найти цитируемый пост)
но мне нужны операции типа double s = SDouble<2>(3.44) или int s = SDouble<2>(3) 

А нельзя оставить только double?  А если нужно будет целое значение, то типы сами приведутся.
PM MAIL   Вверх
baldina
Дата 16.10.2009, 14:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

но мне нужны операции типа double s = SDouble<2>(3.44) или int s = SDouble<2>(3) 

как насчет
Код

double s = SDouble<2>(3.44).getValue ();

PM MAIL   Вверх
baldina
Дата 16.10.2009, 17:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



имхо класс можно покороче сделать и даже ввести таки преобразование в double/int (в этом случае надо запретить неявное преобразование в конструкторе - explicit). дружить операторы с классом не обязательно, все можно определить через базовые операции без доступа к структуре класса

Код

template <unsigned int precision>
class SDouble
{
public:
    // construction
    SDouble (double=0);
    explicit SDouble (const SDouble&);
   
    // comparsion
    bool operator< (const SDouble&) const;
    bool operator== (const SDouble&) const;
    
    //unary operations
    SDouble operator-() const;
    
    // arithmetic updates
    SDouble& operator+= (const SDouble&);
    SDouble& operator-= (const SDouble&);
    SDouble& operator*= (const SDouble&);
    SDouble& operator/= (const SDouble&);
    
    // conversion
    operator double () const;
};

template <unsigned int precision>
bool operator!= (const SDouble<precision>& lhs, const SDouble<precision>& rhs)
{
  return !(lhs == rhs);
}

template <unsigned int precision>
bool operator<= (const SDouble<precision>& lhs, const SDouble<precision>& rhs)
{
  return lhs < rhs || lhs == rhs;
}

template <unsigned int precision>
bool operator>= (const SDouble<precision>& lhs, const SDouble<precision>& rhs)
{
  return !(lhs < rhs) || lhs == rhs;
}

template <unsigned int precision>
bool operator> (const SDouble<precision>& lhs, const SDouble<precision>& rhs)
{
  return !(lhs < rhs || lhs == rhs);
}

#define DEF_BINOP(op,type,subtype) \
  template <subtype S, typename T> \
  type<S> operator op (const type<S> &lhs, const T &rhs) \
  { \
    return lhs op type<S>(rhs); \
  } \
  template <subtype S, typename T> \
  type<S> operator op (const T &lhs, const type<S> &rhs) \
  { \
    return type<S>(lhs) op rhs; \
  } 

#define DEF_BINOP_EQ(op,type,subtype) \
  template <subtype S> \
  type<S> operator op (const type<S> &lhs, const type<S> &rhs) \
  { \
    type<S> result(lhs); \
    result op= rhs; \
    return result; \
  } \
  DEF_BINOP(op,type,subtype) 

DEF_BINOP_EQ(+,SDouble,unsigned int) // SDouble operator + (conversable type, conversable type);
DEF_BINOP_EQ(-,SDouble,unsigned int) // SDouble operator - (conversable type, conversable type);
DEF_BINOP_EQ(*,SDouble,unsigned int) // SDouble operator * (conversable type, conversable type);
DEF_BINOP_EQ(/,SDouble,unsigned int) // SDouble operator / (conversable type, conversable type);

DEF_BINOP(<,SDouble,unsigned int)
DEF_BINOP(==,SDouble,unsigned int)
DEF_BINOP(!=,SDouble,unsigned int)
DEF_BINOP(<=,SDouble,unsigned int)
DEF_BINOP(>=,SDouble,unsigned int)
DEF_BINOP(>,SDouble,unsigned int)

int main()
{
   SDouble<4> ssd0 = 7.12;
   SDouble<4> ssd (7.12);
   SDouble<4> (7.12) + SDouble<4> (5.0);
   SDouble<4> (7.12) + 5.0;
   5.0 + SDouble<4> (7.12);
   SDouble<4> sdr = - ssd + 5.0;

   SDouble<4> z = sdr + (5.0 - sdr) / ssd * 2;

   sdr >= 5.0;
   4 != ssd;

   double x = sdr ;
   int y = int (sdr);
}


а вообще велосипеды уже  изобретены, можно готовым попользоваться:

Код

#include <boost/operators.hpp>

template <unsigned int precision>
class SDouble : boost::operators<SDouble>
{
public:
    // construction
    SDouble (double=0);
    SDouble (const SDouble&);
   
    // comparsion
    bool operator< (const SDouble&) const;
    bool operator== (const SDouble&) const;
    
    // unary operations
    SDouble operator-() const;
    
    // arithmetic updates
    SDouble& operator+= (const SDouble&);
    SDouble& operator-= (const SDouble&);
    SDouble& operator*= (const SDouble&);
    SDouble& operator/= (const SDouble&);
    
    // conversion
    double get() const;
};

int main()
{
   SDouble<4> ssd (7.12);
   SDouble<4> (7.12) + SDouble<4> (5.0);
   SDouble<4> (7.12) + 5.0;
   5.0 + SDouble<4> (7.12);
   SDouble<4> sdr = - ssd + 5.0;

   SDouble<4> z = sdr + (5.0 - sdr) / ssd * 2;

   sdr >= 5.0;
   4 != ssd;

   double x = sdr.get ();
   int y = int (sdr.get ());
}




Это сообщение отредактировал(а) baldina - 16.10.2009, 17:21
PM MAIL   Вверх
likenix
Дата 16.10.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina, SDouble шаблон типа данных.
Vector<int>(23, 45);
Vector<double>(23.565, 45.5656);
Vector<Sdouble<2>>(23.565, 45.5656);

Добавлено через 4 минуты и 8 секунд
baldina, спасибо за идею с boost.
PM MAIL   Вверх
baldina
Дата 16.10.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

baldina, SDouble шаблон типа данных.


я заметил  smile 
а к чему это замечание?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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