我是一个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
答案 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)
IntArray&
rhs
相同并创建数组,但不会复制元素operator[]
正在返回对本地变量的引用。如果要在operator[]
中构建边界检查,则应抛出异常,而不是返回数字。operator[]
正在创建一个新的IntArray
并调用其operator[]
,从而创建一个无限循环。你应该return data[i]
pop_back
返回任何表示返回IntArray&
push_back
中,您必须检查您的阵列是否有效,如果是,请调整capacity
和data
的大小。就像现在一样,你永远不会调整你的数组大小,而且在添加元素之前你不需要先检查它是否需要调整大小。这可能是你获得段错误的原因答案 2 :(得分:0)
您永远不会在push_back()
功能中分配额外的存储空间。你只需将容量加倍即可。这不会神奇地扩展int
的存储空间。您需要分配具有新容量的新块,将内容复制到此新块,然后删除旧块。