c++二维数组赋值失败

#include<iostream>
using namespace std;
class shuzu{
    int a;
    double*b;
public:
    shuzu(string str=" "){
    const int len=str.length();
    char*q=new char[len];
    int i,j;
    for(i=0;i<len;i++)
        q[i]=str[i];
    
    int k=0;
    for(i=0;i<len;i++)
    {if(k%2==0)
        {if(q[i]==',')
        k=k+1;}
    else {if(q[i]>='0'&&q[i]<='9')
        k=k+1;}}//把字符串分成数字片段和非数字片段,并统计片段数量k+1

    char**p=new char*[k+1];
    for(i=0;i<k+1;i++)
    p[i]=new char[len+1];
    for(i=0;i<k+1;i++)
        {p[i][len]='\n';
        for(j=0;j<len;j++)
        p[i][j]=' ';}//生成k行的二维数组,并初始化
    
    for(i=0,k=0;i<len;i++)
    {if(k%2==0)
        {if(q[i]==',')
        k=k+1;}
    else {if(q[i]>='0'&&q[i]<='9')
        k=k+1;}
    p[k][i]=q[i];}//把字符串的数字片段填入奇数行,非数字片段填入偶数行
    
    int u,v;
    a=(k+2)/2;
    b=new double[a];
    for(u=0,v=0;u<k+1;u=u+2,v=v+1)
    b[v]=atof(p[u]);//把奇数行的数组转化为实数并求和
    
    delete p;
    delete q;}
    friend int size(shuzu d);//求数组长度的函数
    shuzu(shuzu& e){//复制构造
        a=e.a;
        b=new double[a];
        int i;
        for(i=0;i<a;i++)
            b[i]=e.b[i];}
    
    shuzu operator+(const shuzu& f){//等长数组相加
        shuzu e;
        int i;
        if(f.a==a){
            e.b=new double[a];
            e.a=a;
            for(i=0;i<a;i++)
                e.b[i]=b[i]+f.b[i];}
        return e;}

    shuzu operator+(double x){//数组中所有数字加x
        shuzu g;
        g.a=a;
        g.b=new double[a];
        int i;
        for(i=0;i<a;i++)
            g.b[i]=b[i]+x;
        return g;
    }
    double &operator()(int e){//数组取值
        return this->b[e];}

    shuzu operator()(int low,int high){//数组裁切
        shuzu g;
        int i;
        if(low>=0&&low<high&&high<=a-1){
            g.a=high-low+1;
            g.b=new double[g.a];
            for(i=0;i<g.a;i++)
                g.b[i]=b[low+i];
            return g;}}

    friend shuzu operator*(double x,const shuzu& h){//数字乘数组
        shuzu g;
        int i;
        g.a=h.a;
        g.b=new double[g.a];
        for(i=0;i<g.a;i++)
            g.b[i]=x*h.b[i];
        return g;}
    shuzu operator*(double x){//数组乘数字
        shuzu g;
        g.a=a;
        g.b=new double[g.a];
        int i;
        for(i=0;i<g.a;i++)
            g.b[i]=x*b[i];
        return g;}
    friend double max(shuzu d);
    friend double min(shuzu d);//求数组内最大和最小值
    friend shuzu sort(shuzu d);//数组从小到大排序
    friend double mean(shuzu d);//求数组内元素平均值
    friend double sum(shuzu d);//数组求和
    friend int find(shuzu d,double x);//某元素在数组内出现的次数
    friend void change(const shuzu& g,shuzu d,double x);//必须配合不等号使用,例如change(a,a<100,100)
    friend shuzu abs(shuzu d);//数组的绝对值
    friend void instead(const shuzu&g,int x,int y,shuzu d);//把数组的第x到y个元素更换为另一个数组的元素,配合数组裁切使用
    friend shuzu enlarge(shuzu g,int x,int y,shuzu d);//扩充数组
    friend shuzu zeros(int x);//生成指定大小的零数组
    shuzu(int x){//定义一个已知长度的数组
        a=x;
        b=new double[a];}
    //shuzu(matrix g,int x){//用矩阵获得数组
    //a=g.n;
    //b=new double[a];
    //int i;
    //for(i=0;i<a;i++)
    //    b[i]=g.p[x][i];}

    shuzu operator<(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]<x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]<x) {
                g.b[j]=i;
                j=j+1;}
            return g;}
    shuzu operator<=(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]<=x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]<=x) {
                g.b[j]=i;
                j=j+1;}
            return g;}
    shuzu operator>(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]>x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]>x) {
                g.b[j]=i;
                j=j+1;}
            return g;}
    shuzu operator>=(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]>=x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]>=x) {
                g.b[j]=i;
                j=j+1;}
            return g;}
    shuzu operator==(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]==x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]==x) {
                g.b[j]=i;
                j=j+1;}
            return g;}
    shuzu operator!=(double x){
        shuzu g;
        int i,j=0;
        for(i=0;i<a;i++)
            if(b[i]!=x) j=j+1;
        g.a=j;
        g.b=new double[j];
        for(i=0,j=0;i<a;i++)
            if(b[i]!=x) {
                g.b[j]=i;
                j=j+1;}
            return g;}

};

int size(shuzu d){
        return d.a;}
double max(shuzu d){
    int i;
    double big=d.b[0];
    for(i=0;i<d.a;i++)
        if(big<d.b[i])
            big=d.b[i];
    return big;}
double min(shuzu d){
    int i;
    double small=d.b[0];
    for(i=0;i<d.a;i++)
        if(small>d.b[i])
            small=d.b[i];
    return small;}
shuzu sort(shuzu d){
    int i,j;
    double b,c;
    shuzu g=d;
    for(i=0;i<g.a;++i)
    for(j=1;j<g.a-i;++j)
        if(g.b[i]>g.b[i+j])
        {b=g.b[i];
        c=g.b[i+j];
        g.b[i+j]=b;
        g.b[i]=c;}
    return g; }
double mean(shuzu d){
    double x=0;
    int i;
    for(i=0;i<d.a;i++)
        x=x+d.b[i];
    x=x/d.a;
    return x;}
double sum(shuzu d){
    double x=0;
    int i;
    for(i=0;i<d.a;i++)
        x=x+d.b[i];
    return x;}
int find(shuzu d,double x){
    int y=0;
    int i;
    for(i=0;i<d.a;i++)
        if(d.b[i]==x)
            y=y+1;
    return y;}
void change(const shuzu& g,shuzu d,double x){
    int i,j;
    for(i=0;i<d.a;i++){
        j=d.b[i];
        g.b[j]=x;}}
shuzu abs(shuzu d){
    shuzu g=d;
    int i;
    for(i=0;i<g.a;i++)
        if(g.b[i]<0)
            g.b[i]=-1*g.b[i];
    return g;}
void instead(const shuzu&g,int x,int y,shuzu d){
    if(d.a==y-x+1&&x>=0&&y<g.a){
        int i;
        for(i=0;i<d.a;i++)
            g.b[x+i]=d.b[i];}
    else std::cout<<"替换失败";
}
shuzu enlarge(shuzu g,int x,int y,shuzu d){
    if(d.a==y-x+1&&y>=g.a&&x>=0){
        shuzu h;
        h.a=y+1;
        h.b=new double[h.a];
        int i;
        for(i=0;i<g.a;i++)
            h.b[i]=g.b[i];
        for(i=g.a;i<h.a;i++)
            h.b[i]=0;
        for(i=0;i<d.a;i++)
            h.b[x+i]=d.b[i];
        return h;}
    else std::cout<<"扩充失败";}
shuzu zeros(int x){
    shuzu g;
    g.a=x;
    g.b=new double[x];
    int i;
    for(i=0;i<x;i++)
        g.b[i]=0;
    return g;}

class matrix{
private:int m;
        int n;
        double**p;
public:
    matrix(int x=1,int y=1){//生成m行n列矩阵
    m=x; n=y;
    p=new double*[m];
    int i;
    for(i=0;i<m;i++)
        p[i]=new double[n];}
    matrix(matrix& g){//复制构造
        m=g.m; n=g.n;
        p=new double*[m];
    int i;
    for(i=0;i<m;i++)
        p[i]=new double[n];}
    matrix(shuzu g){//用数组获得矩阵
    m=1; n=size(g);
    p=new double*[1];
    p[0]=new double[n];
    int i;
    for(i=0;i<n;i++)
    p[0][i]=g(i);}

    matrix operator+(const matrix& f){//等大小矩阵相加
        matrix e;
        if(f.m==m&&f.n==n){
            e.m=m; e.n=n;
            e.p=new double*[m];
        int i;
        for(i=0;i<m;i++)
        e.p[i]=new double[n];
        int j;
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
            e.p[i][j]=p[i][j]+f.p[i][j];
        return e;}}

    matrix operator+(double x){//矩阵中所有数字加x
        matrix g;
        g.m=m; g.n=n;
        g.p=new double*[m];
        int i;
        for(i=0;i<m;i++)
        g.p[i]=new double[n];
        int j;
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
            g.p[i][j]=p[i][j]+x;
        return g;}

    double &operator()(int x,int y){//矩阵取值
        return p[x][y];}
    shuzu& operator[](int x){//矩阵里获得数组
        shuzu g(n);
        int i;
        for(i=0;i<n;i++)
            g(i)=p[x][i];
        return g;}

    matrix operator()(int low,int high,int x,int y){//矩阵裁切
        matrix g;
        if(low<=high&&x<=y&&low>=0&&x>=0&&high<g.m&&y<g.n){
            g.m=high-low+1;
            g.n=y-x+1;
        g.p=new double*[g.m];
        int i;
        for(i=0;i<g.m;i++)
        g.p[i]=new double[g.n];
        int j;
        for(i=0;i<g.m;i++)
            for(j=0;j<g.n;j++)
            g.p[i][j]=p[i+low][j+x];
        return g;}}

    friend matrix operator*(double x,const matrix& h){//数字乘数组
        matrix g;
        g.m=h.m; g.n=h.n;
        g.p=new double*[g.m];
        int i;
        for(i=0;i<g.m;i++)
        g.p[i]=new double[g.n];
        int j;
        for(i=0;i<g.m;i++)
            for(j=0;j<g.n;j++)
            g.p[i][j]=h.p[i][j]*x;
        return g;}
    matrix operator*(double x){//矩阵乘数字
        matrix g;
        g.m=m; g.n=n;
        int i;
        for(i=0;i<g.m;i++)
        g.p[i]=new double[g.n];
        int j;
        for(i=0;i<g.m;i++)
            for(j=0;j<g.n;j++)
            g.p[i][j]=p[i][j]*x;
        return g;}
    friend shuzu size(matrix g);
    friend double max(matrix g);
    friend double min(matrix g);
    friend matrix reshape(matrix g,int x);//重新改变矩阵的长宽
    friend matrix zeros(int x,int y);
    friend void imshow(matrix g);
    
};

shuzu size(matrix g){
    shuzu h(2);
    h(0)=g.m;
    h(1)=g.n;
    return h;}
double max(matrix g){
    int i,j;
    double big=g.p[0][0];
    for(i=0;i<g.m;i++)
        for(j=0;j<g.n;j++)
        if(big<g.p[i][j])
            big=g.p[i][j];
        return big;}
double min(matrix g){
    int i,j;
    double small=g.p[0][0];
    for(i=0;i<g.m;i++)
        for(j=0;j<g.n;j++)
        if(small>g.p[i][j])
            small=g.p[i][j];
        return small;}
matrix reshape(matrix g,int x){
    if((g.m*g.n)%x==0){
        int y=g.m*g.n/x;
        matrix g;
        g.m=x; g.n=y;
        g.p=new double*[g.m];
        int i;
        for(i=0;i<g.m;i++)
            g.p[i]=new double[g.n];
        shuzu c;
        c=g[0];
    for(i=1;i<g.m;i++){
        shuzu d;
        d=g[i];
        c=enlarge(c,size(c),size(c)-1+g.n,d);}
    int k=-1;
    for(i=0;i<size(c);i++){
        if(i%g.n==0) k=k+1;
        g.p[k][i%g.n]=c(i);}
    return g;}}
matrix zeros(int x,int y){
    matrix g;
    g.m=x; g.n=y;
    g.p=new double*[g.m];
        int i;
        for(i=0;i<g.m;i++)
            g.p[i]=new double[g.n];
        int j;
        for(i=0;i<g.m;i++)
            for(j=0;j<g.n;j++)
            g.p[i][j]=0;
        return g;}
void imshow(matrix g){
    int i,j=0;
    for(i=0;i<g.m;i++){
        if(j==g.n) cout<<endl;
        for(j=0;j<g.n;j++)
            std::cout<<g.p[i][j]<<" ";}}



int main(){
    shuzu a("4,4,4,4,4");
    matrix b;
    b=zeros(5,10);
    imshow(b);
    return 0;}

那要看x,y是不是0了