开发者社区> 问答> 正文

C++新手求助啊!!~? 400 报错

C++新手求助啊!!~? 400 报错 // Array.cpp : 定义控制台应用程序的入口点。
//用类模板创建的一维动态数组,谁帮忙改改重载符号+,目的是想要合并两个数组, 还有重载 //= 也出错

#include "stdafx.h"
#include "iostream"
using namespace std;
template <typename  T>
class Array
{
public:
    Array(){}
    Array(int l)                                    //构造函数
    {
        if(l<0) cout<<"throw BadInitializers()";
        length=l;
        data=new T[length+1];
    }
    ~Array()                                    //析构函数
    {
        delete [] data;
    }
    Array(const Array<T> & a)
    {
        length=a.length;
        data=new T[length];
        for(int i=0;i<length;i++)
            data[i]=a.data[i];
    }

    T & operator [](int l)const               
    {
        if(l>=length || l<0) cout<<"throw OutOfBounds()";
            return data[l];
    }
    Array <T> & operator =(Array & a)           
    {
        if(this!=&a)
        {
            length=a.length;
            delete[] data;                    //释放原空间
            data=new T[length];                //申请空间
            for(int i=0;i<length;i++)        //复制元素
                data[i]=a.data[i];
        }
        return this;
    }
    friend Array <T> & operator +(Array<T> & a,Array<T> & b)
    {
        Array<T> ar;
        int l=a.length+b.length;
        ar.data=new T[l];
        for(int i=0;i<a.length;i++)
            ar.data[i]=a[i];
        for(int j=i;j<b.length;j++)
            ar.data[j]=b[j];
        return ar;
    }
    void insert(T  num,int place)
    {
        length=length+1;
        for(int i=length-1;i>=place;i--)
        {
            data[i]=data[i-1];
        }
         data[place-1]=num;
    }
    void del(int place)
    {
        length=length-1;
        for(int i=place-1;i<length;i++)
            data[i]=data[i+1];
    }
    void print()
    {
        for(int i=0;i<length;i++)
        cout<<data[i]<<endl;
    }
    T * get_data(){return data;}
    int get_length(){return length;}
private:
        T * data;
        int length;
};

int _tmain(int argc, _TCHAR
argv[])
{
    Array<int>  array(5),b(5),c;
    int num;
    for(int i=0;i<array.get_length();i++)
    {
        //cin>>num;
        //array.get_data()[i]=num;
        //b.get_data()[i]=num;
        array.get_data()[i]=1;
        b.get_data()[i]=1;
    }
    array.insert(2,2);
    array.del(2);
    array.print();
    c=array+b;
    cout<<"ccc";
    c.print();
    return 0;
}


展开
收起
爱吃鱼的程序员 2020-06-04 13:22:05 493 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    for(int i=0;i<a.length;i++) ar.data[i]=a[i]; for(int j=i;j<b.length;j++) ar.data[j]=b[j];


    这段逻辑有问题吧 j<b.length ,这个判断就直接为false了 应该是j<(a.length + b.length) ,而且第二个for循环给j赋值的i 属于上个for循环的局部变量吧

    而且相加返回的时候 应该用赋值构造函数吧。。

    ######

    引用来自“jqy”的答案

    for(int i=0;i<a.length;i++) ar.data[i]=a[i]; for(int j=i;j<b.length;j++) ar.data[j]=b[j];

    这段逻辑有问题吧 j<b.length ,这个判断就直接为false了 应该是j<(a.length + b.length) ,而且第二个for循环给j赋值的i 属于上个for循环的局部变量吧

    对,这个我已经改过来了。

    我想问下我的insert函数,每插入一个数,就要申请一个空间,以至于我的构造函数,比数组原长要申请多一个才能插入一个数,否则会出错,难道只能通过这种方法,在构造函数加长数组,有没有别的方法

    ######

    引用来自“java_hh”的答案

    引用来自“jqy”的答案

    for(int i=0;i<a.length;i++) ar.data[i]=a[i]; for(int j=i;j<b.length;j++) ar.data[j]=b[j];

    这段逻辑有问题吧 j<b.length ,这个判断就直接为false了 应该是j<(a.length + b.length) ,而且第二个for循环给j赋值的i 属于上个for循环的局部变量吧

    对,这个我已经改过来了。

    我想问下我的insert函数,每插入一个数,就要申请一个空间,以至于我的构造函数,比数组原长要申请多一个才能插入一个数,否则会出错,难道只能通过这种方法,在构造函数加长数组,有没有别的方法

    这个就是数组的缺陷吧,不能动态增长,只能动态申请。如果需要动态添加的话,我觉得最好用链表。
    ###### Array<T> ar; //这里调用无参构造函数,应该用有参的,用下一行的l为参数传入就行了,
            int l=a.length+b.length; 
            ar.data=new T[l]; //这行会导致内存泄漏,不要这行,其它的保持原样应该可以了
            for(int i=0;i<a.length;i++) 
                ar.data[i]=a[i]; 
            for(int j=i;j<b.length;j++) 
                ar.data[j]=b[j]; 

            return ar; 

    有标准的std::vector<T>或std::list<T>可用,不用自己写的.

    ######恩, 我已经改为     Array <T> & operator +(Array<T> & a)
        {
       
            for(int i=length;i<a.length+length;i++)
                data[i]=a[i-length];
            length=length+a.length;
            return *this;
        }
    ###### @jqy : 你看代码,他并没有重新new新的内存.如果在for之前新new一个大小为this.length+a.length的大小就可以.同时原来的要先保存,复制之后再删除.###### @周翼翼 : 这个data用new动态分配,应该没什么问题吧!只是新增的时候,必须delete掉,然后重新分配length+1的长度的空间。######这个有大问题,你只是拼命给原来的data里放数据,可是data的内存大小在构造的时候已经定了,你这么放肯定会出事.你想,data=new T[lenght],你给data[length]赋值,...结果会怎么样?
    2020-06-04 16:50:44
    赞同 展开评论 打赏
问答分类:
C++
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载