2013-04-15 5 views
0

У меня есть класс BigInteger, который поддерживает операцию с большим целым числом. Я хочу реализовать операцию смешивания между BigInteger и встроенным типом 'int'. Другими словами, я хочу поддержать после заявленийкак преобразовать встроенный тип в пользовательский тип

BigInteger a(10); 
a + 10; 
10 + a; 

я знаю перегруженная функция может иметь дело с этим

BigInteger operator +(const BigInteger&, const int&); 
BigInteger operator +(const int&, const BigInteger&); 

Кроме того, я знаю, что оператор преобразования может иметь дело только с ним,

operator int(); 

Но вышеупомянутая функция поддержки конвертирует BigInteger в int, который будет теряет точность. Я ищу некоторые методы, которые будут проще, чем перегруженные функции и сохранить точность.

Спасибо, всем.

я попробовать,

#include <iostream> 
using namespace std; 

class BigInteger 
{ 
public: 
    BigInteger(const int& i) 
    { 
     cout << "construct: " << i << endl; 
     val = i; 
    } 

// BigInteger operator +(const BigInteger& tmp) const 
// { 
//  return BigInteger(val + tmp.val); 
// } 

    friend ostream& operator <<(ostream& os, const BigInteger& bi) 
    { 
     os << bi.val << endl; 
     return os; 
    } 

    int val; 
}; 

BigInteger operator +(const BigInteger& a, const BigInteger& b) 
{ 
    return BigInteger(a.val + b.val); 
} 

int main(int argc, const char *argv[]) 
{ 
    BigInteger a(12); 
    cout << (a + 123) << endl; 
    cout << (1231 + a) << endl; 

    return 0; 
} 

почему я не могу использовать функцию член? Как это работает?

+2

насколько проще, чем перегрузка op +, может ли это получить? – PlasmaHH

+0

Что касается различий между свободной функцией и функцией-членом: http://stackoverflow.com/a/4421729/20984. Короче говоря, предпочитайте бесплатные функции, чтобы «int + BigInteger» и «BigInteger + int» работали одинаково (с функцией-членом, первая не будет работать). –

ответ

3

Таким образом, сделать конструктор BigInteger(int), и определить BigInteger operator(const BigInteger &lhs, const BigInteger &rhs).

+0

Почему я не могу использовать функцию-член? – alfredtofu

+0

Это не совсем то, что я пытался объяснить, но да, можно. –

+0

Я провалился .. проблема обновлена ​​ – alfredtofu

4

Вам нужно добавить конструктор, который будет принимать значение BigInteger от Int

BigInteger (const int& value) 
1

Удостоверьтесь, что вы только что переводите с int на номер BigInteger, а не наоборот. Или выкиньте исключение, если обратное преобразование приведет к переполнению.

+0

BTW, существуют ли неявные и явные операторы преобразования в C++? Например, в Delphi вы можете определить различное поведение для неявного и явного преобразования. – Spook

+0

@Spook Они новы в [C++ 11] (http://www.stroustrup.com/C++11FAQ.html#explicit-convertion). См. Ссылку для объяснения явных конструкторов в C++ 98. Но вы все еще не можете иметь implicits и explicits бок о бок. –

3

Вы должны реализовать перегрузки для BigInteger operator+(BigInteger const&, int); Поскольку Трава Саттер и Андрей Александреску написал в Coding Coding Standart (пункт 29), вы должны «рассмотреть перегрузку, чтобы избежать неявного типа разговора». Ваш BigInteger может использовать новый оператор для построения, которого можно избежать в этом конкретном случае. Кроме того, вы должны выполнять бинарную операцию в терминах одноместной операции:

class BigInteger { 
    // .. 
public: 
    BigInteger& operator+=(int); // this operation can reuse BigIntegers buffer 
    // .. 
} 

BigInteger operator+(BigInteger lhs, int rhs) 
{ 
    return lhs+=rhs; 
} 

BigInteger operator+(int lhs, BigInteger rhs) 
{ 
    return rhs+=lhs; 
} 
+0

Спасибо! Btw, лучше ли позволить оператору BigInteger + (BigInteger lhs, int rhs) 'быть функцией друга? – alfredtofu

+0

@alfredtofu, конечно. –

0

определить конструктор BigInteger (INT) и перегрузить оператор BigInteger оператор + (сопзЬ BigInteger & левый, константный BigInteger & справа).