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
3 odpowiedzi
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
- Twój operator przypisania powinien zwrócić
IntArray&
- Twój konstruktor kopiujący ustawia rozmiar i pojemność na to samo, co
rhs
i tworzy tablicę, ale nie kopiuje elementów ponad - Twój
operator[]
zwraca odwołanie do zmiennej lokalnej. Jeśli chcesz wbudować sprawdzanie granic woperator[]
, powinieneś zgłosić wyjątek, a nie zwracać liczbę. - Twój
operator[]
tworzy nowyIntArray
i wywołuje jegooperator[]
, tworząc nieskończoną pętlę. Powinieneśreturn data[i]
- Nie zwracasz niczego z
pop_back
, który mówi, że zwracaIntArray&
- W
push_back
musisz sprawdzić, czy twoja tablica jest na wyczerpaniu, a jeśli tak, zmień rozmiarcapacity
idata
. Tak jak teraz, nigdy nie zmieniasz rozmiaru tablicy i nie sprawdzasz najpierw, czy wymaga zmiany rozmiaru przed dodaniem elementu. Prawdopodobnie dlatego dostajesz segfault
Nigdy nie przydzielasz dodatkowego miejsca w funkcji push_back()
. Po prostu podwajasz pojemność i to wszystko. To nie zwiększy magicznie miejsca na Twoje int
s. Musisz przydzielić nowy blok o nowej pojemności, skopiować zawartość do tego nowego bloku, a następnie usunąć stary blok.
Podobne pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .