编译错误求助

P1009 [NOIP1998 普及组] 阶乘之和

sLMxf @ 2022-12-01 20:02:33

#include<bits/stdc++.h>
using namespace std;
struct bigint{
    int len,a[110];
    int &operator[](int i)
    {
        return a[i];
    }
    bigint(int x=0){
        memset(a,0,sizeof(a));
        for(int len=1;x;len++)
            a[len]=x%10,x/=10;
        len--;
    }
    void flatten(int l)
    {
        len=l;
        for(int i=1;i<=len;i++)
            a[i+1]+=a[i]/10,a[i]=a[i]%10;
        while(a[len]) len--;
    }
    void print()
    {
        for(int i=max(len,1);i>=1;i--)
            cout<<a[i];
    }
    bigint operator+(bigint a,bigint b)
    {
        bigint c;
        c.len=max(a.len,b.len);
        for(int i=1;i<=c.len;i++)
            c[i]+=a[i]+b[i];
        c.flatten(c.len+1);
        return c;
    }
    bigint operator*(bigint a,int b)
    {
        bigint c;
        int len=a.len;
        for(int i=1;i<=len;i++)
            c[i]+=a[i]*b;
        c.flatten(2*len);
        return c;
    }
};
int main()
{
    bigint ans(0),fac(0);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        fac=fac*i;
        ans=ans+fac;
    }
    ans.print();
    return 0;
}

注:信息是
[Error] 'bigint bigint::operator+(bigint, bigint)' must take either zero or one argument

[Error] 'bigint bigint::operator*(bigint, int)' must take either zero or one argument


by SkyWave @ 2022-12-01 20:08:09

@so_langman_xiaoFeng 两类的运算符执行是这样的

a + b 相当于 a 这个对象调用 + 这个函数,参数为 b,所以当运算符在属于类成员时只需要一个参数表示 b,而 a 就是当前这个类,可以用this->访问当前类的成员。

当定义成友元时或者在类外重载运算符时,+ 并不是个类成员函数,而是单纯扩展了 + 这个运算符的用途,此时需要两个参数表示 a 和 b。


by SkyWave @ 2022-12-01 20:09:44

@so_langman_xiaoFeng 还有传参数建议不改变的时候传const&,改变的时候传&,避免大空间赋值,否则调用 + 的时候常数巨大,需要把原类的成员都拷贝一遍,也浪费了空间复杂度


|