Das hinzufügen, um dynamische array
Disclaimer: ja, ich weiß, über std::vector. Ich Tue dies zum Wohle des Lernens.
Ich bin dabei, eine dynamische array-Klasse, und ich bin versucht zu bekommen add, um zu arbeiten.
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
Funktioniert es... irgendwie. Die Funktion arbeitet, hinzufügen das element, aber dann stürzt das Programm ab beim beenden. Keine Fehler, kein gar nichts. Es ist einfach einfriert, und ich habe, um es zu schließen, verwenden (Umschalt + F5).
So, was ist daran falsch?
Hier ist meine ganze Klasse. Wenn ich nicht include eine Funktion, die es bedeutet, es gibt kein code.
#ifndef ARRAY_H
#define ARRAY_H
using namespace std;
template <class T>
class Array
{
private:
T * mData;
int mCount;
public:
Array();
~Array();
void add(T value);
void insert(T value, int index);
bool isEmpty();
void display();
bool remove(T value);
bool removeAt(int index);
int size();
T & operator[](const int index);
};
//Constructors /Destructors
//--------------------------------------------------------
template <class T>
Array<T>::Array()
{
mCount = 0;
mData = new T[mCount];
for (int i = 0; i < mCount; i++)
mData[i] = 0;
}
template <class T>
Array<T>::~Array()
{
delete[] mData;
}
//General Operations
//--------------------------------------------------------
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
template <class T>
void Array<T>::display()
{
if (isEmpty())
{
cout
<< "The array is empty."
<< "\n\n";
return;
}
cout << "(";
for (int i = 0; i < mCount; i++)
{
cout << mData[i];
if (i < mCount - 1)
cout << ", ";
}
cout << ")" << "\n\n";
}
template <class T>
bool Array<T>::isEmpty()
{
return mCount == 0;
}
template <class T>
int Array<T>::size()
{
return mCount;
}
//Operator Overloads
//--------------------------------------------------------
template <class T>
T & Array<T>::operator[](const int index)
{
return mData[index];
}
#endif
Benötigen Sie weitere info laß mich wissen, und ich kann post-it.
OT, aber warum nicht std::vector?
für pädagogischen Zweck
Sicherlich müssen Sie mcount + 1 in der array-Deklaration zu vermeiden, dass eine array out of bounds exception
Der erste Fehler ist in
Was ist die invariante der
für pädagogischen Zweck
Sicherlich müssen Sie mcount + 1 in der array-Deklaration zu vermeiden, dass eine array out of bounds exception
Der erste Fehler ist in
add
Funktion. Ändern Sie den code, um T * tmp = new T[mCount + 1];
Was ist die invariante der
mCount
?
InformationsquelleAutor Gurman8r | 2015-10-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt
mCount
hält die Anzahl der Elemente im array, dann wird beim hinzufügen eines neuen Elements, das Sie wirklich haben, ordnen Sie mindestensmCount + 1
Elemente (vorausgesetzt natürlich, Sie wollen, halten Sie alle, die alten und die neuen) über:als Gegensatz zu:
Wenn es für nichts anderes als didaktische Zwecke, verwenden Sie bitte
std::vector
statt. Zum Beispiel Ihreadd
Funktion ist nicht exception-sicher.Wow, danke. Ich Liebe es, wenn die Lösung direkt unter meine Nase, aber ich kann es nicht sehen. Sobald es lasst mich akzeptiere deine Antwort, ich werde.
Ich würde lieber verschieben Schrittweite von
mCount
an den Anfang der Funktion.Wahrscheinlich wollen Sie behalten den alten Wert, bis Sie einen guten Zustand wieder. Was ist, wenn das alloc ausfällt?
Wie so?
InformationsquelleAutor Shoe