为什么我的推回功能不起作用,只是出现了一个段错误

时间:2012-02-26 23:57:15

标签: c++ dynamic constructor copy overloading

我是一个C ++ noob,我试图理解代码更好地覆盖,所以我构建了这个类来学习重载运算符的基础知识以及推回和弹回函数,即创建我自己的变量数组。这不是课堂作业,我只是想自学代码。

这实际上是我做过的计算机科学编程测试问题,我试图从中学习,以防他们再次向我扔类似的东西。我从java开始,现在做C ++。

    #include"IntArray.h"
    #include<iostream>
using namespace std;

IntArray::IntArray()
{
    size=0;
    capacity=1;
    data = new int[capacity];
    cout<<"constructor fired off"<<endl;
}

IntArray::~IntArray()
{
    delete [] data;
    cout<<"Destructor fired off"<<endl;
}
IntArray::IntArray (const IntArray & m)
{
    size=m.size;
    capacity=m.capacity;
    data= new int[capacity];
    cout<<"copy constructor fired off"<<endl;

}
IntArray IntArray::operator= (const IntArray & other)
{
    cout<<"operator= fired off"<<endl;
    if(this != &other)//comparing the addresses
    {
        delete [] data;
        size= other.size;
        capacity = other.capacity;
        data = new int[capacity];
        for (int index=0; index<size; index++)
        {
            data[index]=other.data[index];
        }
    }
    return *this;
}

int& IntArray::operator[] (int n)
{
    if(n<0||n>=size)
    {


    cout<<"Array not big enough"<<endl;
    return n;
    }

    IntArray a;
    return a[n];
}
IntArray& IntArray::push_back(int n)
{
    data[size]=n;
    size++;
    if(size==capacity)
        capacity=capacity*2;
    return *this;
}
IntArray& IntArray::pop_back()
{
    if(size>0)
        size--;
}
double IntArray::average()
{
    double sum=0;
    int count=0;
    for(int index=0; index<size; index++)
    {
        sum+=data[index];
        count++;
    }
    return sum/count;
}
int IntArray::getSize()
{
    return size;
}
int IntArray::getCapacity()
{
    return capacity;
}

我的文件

#ifndef INTARRAY_H_INCLUDED
#define INTARRAY_H_INCLUDED

class IntArray
{
    private:
    int size;
    int capacity;
    int *data;

    public:
    IntArray();
    ~IntArray();
    IntArray (const IntArray &);
    IntArray operator= (const IntArray &);

    int& operator[] (int);
    IntArray& push_back(int);
    IntArray& pop_back();
    double average();
    int getSize();
    int getCapacity();
};

#endif // INTARRAY_H_INCLUDED

3 个答案:

答案 0 :(得分:1)

这对我来说并没有多大帮助,但对于我来说,有太多的东西是次优的。

如果这是一个编程练习,那么你需要提出一个更好的设计。我会避免使用new和delete的原始指针,查看智能指针。

如果你真的打算使用它,我不会提供符合你需要的标准。

#include <vector>
:::
std::vector<int> i5(5); //five ints
i5.push_back(6); //now six
i5.pop_back(); //five again
i5.clear(); //non

答案 1 :(得分:0)

  1. 您的赋值运算符应返回IntArray&
  2. 您的复制构造函数将大小和容量设置为与rhs相同并创建数组,但不会复制元素
  3. 您的operator[]正在返回对本地变量的引用。如果要在operator[]中构建边界检查,则应抛出异常,而不是返回数字。
  4. 您的operator[]正在创建一个新的IntArray并调用其operator[],从而创建一个无限循环。你应该return data[i]
  5. 您没有从pop_back返回任何表示返回IntArray&
  6. 的内容
  7. push_back中,您必须检查您的阵列是否有效,如果是,请调整capacitydata的大小。就像现在一样,你永远不会调整你的数组大小,而且在添加元素之前你不需要先检查它是否需要调整大小。这可能是你获得段错误的原因

答案 2 :(得分:0)

您永远不会在push_back()功能中分配额外的存储空间。你只需将容量加倍即可。这不会神奇地扩展int的存储空间。您需要分配具有新容量的新块,将内容复制到此新块,然后删除旧块。