Jestem takim noobem C++ i próbuję lepiej zrozumieć kod, który obejmuje, więc zbudowałem tę klasę, aby nauczyć się podstaw operatorów przeciążania, a także funkcji push back i pop back, tj. Stworzyłem własną tablicę zmiennych. To nie jest zadanie klasowe, które próbuję tylko nauczyć się kodu.

To było właściwie pytanie testowe z programowania komputerowego, które zrobiłem i próbuję się z niego uczyć, na wypadek, gdyby znowu rzucili we mnie coś podobnego. Zaczynałem w Javie, a teraz robię 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;
}

Mój plik 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
0
Cferrel 27 luty 2012, 03:57

3 odpowiedzi

Najlepsza odpowiedź

To niewiele pomoże, ale jest zbyt wiele rzeczy, które nie są optymalne, abym mógł się nimi zająć.

Jeśli to ćwiczenie z programowania, to naprawdę musisz wymyślić lepszy projekt. Unikałbym surowych wskaźników z nowymi i usuwał, zaglądałbym do inteligentnych wskaźników.

Jeśli rzeczywiście zamierzasz z tego korzystać, nie zapewniłbym standardu typu, który spełni Twoje potrzeby.

#include <vector>
:::
std::vector<int> i5(5); //five ints
i5.push_back(6); //now six
i5.pop_back(); //five again
i5.clear(); //non
1
Robᵩ 27 luty 2012, 04:54
  1. Twój operator przypisania powinien zwrócić IntArray&
  2. Twój konstruktor kopiujący ustawia rozmiar i pojemność na to samo, co rhs i tworzy tablicę, ale nie kopiuje elementów ponad
  3. Twój operator[] zwraca odwołanie do zmiennej lokalnej. Jeśli chcesz wbudować sprawdzanie granic w operator[], powinieneś zgłosić wyjątek, a nie zwracać liczbę.
  4. Twój operator[] tworzy nowy IntArray i wywołuje jego operator[], tworząc nieskończoną pętlę. Powinieneś return data[i]
  5. Nie zwracasz niczego z pop_back, który mówi, że zwraca IntArray&
  6. W push_back musisz sprawdzić, czy twoja tablica jest na wyczerpaniu, a jeśli tak, zmień rozmiar capacity i data. Tak jak teraz, nigdy nie zmieniasz rozmiaru tablicy i nie sprawdzasz najpierw, czy wymaga zmiany rozmiaru przed dodaniem elementu. Prawdopodobnie dlatego dostajesz segfault
0
Seth Carnegie 27 luty 2012, 04:10

Nigdy nie przydzielasz dodatkowego miejsca w funkcji push_back(). Po prostu podwajasz pojemność i to wszystko. To nie zwiększy magicznie miejsca na Twoje ints. Musisz przydzielić nowy blok o nowej pojemności, skopiować zawartość do tego nowego bloku, a następnie usunąć stary blok.

0
jrok 27 luty 2012, 04:10