【问题标题】:ambiguous overload in big numbers class大数类中的模棱两可的重载
【发布时间】:2019-04-27 13:41:30
【问题描述】:

我正在构建一个大数字类,但我面临一个我自己无法解决的问题。

首先,类是这样的:

class bigNumber{
private:
    char v[BNmaxLength];
    int L;
    void setll(long long int);
    int comp(bigNumber);
    void erase0();
    void mult10(int);
    void div10(int);
public:
    bigNumber(){
        setll(0);
    }
    bigNumber(long long int q){
        setll(q);
    }
    bigNumber operator=(long long int);
    operator int();
    bool operator==(bigNumber);
    bool operator!=(bigNumber);
    bool operator<(bigNumber);
    bool operator<=(bigNumber);
    bool operator>(bigNumber);
    bool operator>=(bigNumber);
    bigNumber operator+(bigNumber);
    bigNumber operator+=(bigNumber);
    bigNumber& operator++();
    bigNumber operator++(int);
    bigNumber operator-(bigNumber);
    bigNumber operator-=(bigNumber);
    bigNumber& operator--();
    bigNumber operator--(int);
    bigNumber operator*(long long int);
    bigNumber operator*=(long long int);
    friend std::istream& operator>>(std::istream&, bigNumber&);
    friend std::ostream& operator<<(std::ostream&, bigNumber);
};

我希望能够写出这样的东西:

bigNumber b=276743;
int a;
a=b;

所以我通过这样做将类型转换运算符从 bigNumber 重载为 int:

bigNumber::operator int(){
    int a=0;
    for(int i=L;i>=1;--i){
        a*=10;
        a+=v[i];
    }
    return a;
};

但是如果我输入

bigNumber b=276743;
int a=34672;
cout<<(b<a);

它显示此错误:

'operator

注意:候选人是:

注意:运算符

注意:bool bigNumber::operator

如何对 bigNumber 类进行类型转换,以便:

  1. 不再出现此错误

  2. 不使用显式类型转换

  3. 总是将 int 转换为 bigNumber 以免丢失精度(我观察到在我写 a&lt;b 时它没有这样做)

【问题讨论】:

  • 如何对 bigNumber 类进行类型转换 -- 我建议不要这样做。即使您要编译代码,您知道何时何地调用您的运算符 int() 吗?相反,只需创建一个 to_int() 函数。
  • 因为我希望它们像 int 或 long long 一样使用。
  • 说真的,如果你使用你的类编写了一个非玩具程序,我敢打赌你会发现operator int() 几乎不会在任何地方使用。如果确实需要使用它,只需创建一个to_int() 函数,如前所述。然后代码将被编译,编码器将明确地看到正在发生的事情,而不是调用对 int() 的秘密调用。
  • friend std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, bigNumber); 另外,第二个参数应该是const bigNumber&amp;,而不是值类型。

标签: c++ class casting type-conversion


【解决方案1】:

首先,可能有损的操作应该是明确的。

第二,有3个重载:

friend bool operator==(bignumber const&,bignumber const&);
friend bool operator==(int,bignumber const&);
friend bool operator==(bignumber const&,int);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多