Почему мои функции возврата не работают и просто возникают ошибки - PullRequest
0 голосов
/ 27 февраля 2012

Я - такой нубик из C ++, и я пытаюсь лучше понять код, который я описываю, поэтому я создал этот класс, чтобы изучить основы перегрузочных операторов, а также функций push back и pop back, т.е. создать свой собственный массив переменных.Это не классное задание, я просто пытаюсь научить себя этому коду.

На самом деле это был тестовый вопрос по программированию, который я задал, и я пытаюсь извлечь из него урок на тот случай, если мне бросят что-то подобноеснова.Я начал в 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;
}

Мой файл h

#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 ]

1 голос
/ 27 февраля 2012

Это не очень поможет, но есть слишком много, что неоптимально для меня.

Если это упражнение по программированию, то вам действительно нужно придумать лучший дизайн. Я бы избегал необработанных указателей с новыми и удалял, посмотри на умные указатели.

Если вы действительно собираетесь использовать это, я бы не стал предоставлять стандарт, который будет соответствовать вашим потребностям.

#include <vector>
:::
std::vector<int> i5(5); //five ints
i5.push_back(6); //now six
i5.pop_back(); //five again
i5.clear(); //non
0 голосов
/ 27 февраля 2012

Вы никогда не выделяете дополнительное хранилище в своей функции push_back(). Вы просто удваиваете емкость и все. Это волшебным образом не расширит хранилище для ваших int с. Вам необходимо выделить новый блок с новой емкостью, скопировать содержимое в этот новый блок и затем удалить старый блок.

0 голосов
/ 27 февраля 2012
  1. Ваш оператор присваивания должен вернуть IntArray&
  2. Ваш конструктор копирования устанавливает размер и емкость так же, как rhs, и создает массив, но не копирует элементы поверх
  3. Ваш operator[] возвращает ссылку на локальную переменную. Если вы хотите встроить проверку границ в operator[], вы должны выдать исключение, а не возвращать число.
  4. Ваш operator[] создает новый IntArray и вызывает его operator[], создавая бесконечный цикл. Вы должны return data[i]
  5. Вы не возвращаете ничего из pop_back, которое говорит, что оно возвращает IntArray&
  6. В push_back вы должны проверить, заполнен ли ваш массив, и, если это так, изменить размеры capacity и data. Как и сейчас, вы никогда не изменяете размер массива и не проверяете сначала, нужно ли ему изменять размер перед добавлением элемента. Вероятно, поэтому вы получаете segfault
...