class vector probleme beim nachprogrammieren
-
hustbaer schrieb:
rüdiger schrieb:
Tipp: #pragma once benutzt man nicht, dafür gibt es portable Include-Guards.
Tip: Include Guards benutzt man nicht, dafür gibts #pragma once.
Tip: Viel Spaß mit nicht Microsoft Compilern!
Du nutzt immer noch keine Initialisierungsliste
Du solltest deinem Vektor unbedingt eine Wertsemantik verleihen
if (v) im d'tor ist unnütz
Im operator[] auch ein unsigned int übergeben (Indice im Minusbereich gibts nicht)
Unbedingt einen konstanten operator[] hinzufügen
Die zwei letzten Punkte auch für die Methode at
getsize sollte konstant sein
// Dieser Part muss in der Headerdatei stehen, ist ein bug in VSC++ <- Das ist kein Bug sondern vollkommen korrekt!
vector<int>::vector(unsigned int s) <- Warum hast du den c'tor nur für integer spezialisiert?grüße
-
David_pb schrieb:
hustbaer schrieb:
rüdiger schrieb:
Tipp: #pragma once benutzt man nicht, dafür gibt es portable Include-Guards.
Tip: Include Guards benutzt man nicht, dafür gibts #pragma once.
Tip: Viel Spaß mit nicht Microsoft Compilern!
GPP, Digital Mars, ugu (HP), ... garkein Problem. Weiss nicht was ihr Mädchen immer habt.
"#pragma once" sollte standardisiert werden!
Dämliche include Guards nerven mich schon ewig.
-
hustbaer schrieb:
"#pragma once" sollte standardisiert werden!
Dämliche include Guards nerven mich schon ewig.Da hast du ganz recht - es SOLLTE standardisiert werden (aber es IST nicht). Der Standard legt afaik lediglich fest, daß ein Compiler #pragma kennen muß - wie er es nutzt, ist nicht weiter definiert.
-
EDIT: Erks. Blubb. *verwirr*
-
Hi,
zu meiner Klasse hab ich grad ein Problem und zwar, ich kann elemente anhängen, aber wie lösche ich die letzten elemente? Am besten wär es ja ein x belibiges element... Ich hab kein Plan wie ich das machen soll.
Der Code steht ja noch auf Seite 1.
template<typename T> void vector<T>::delete_last() { delete v[size - 1]; }Das funktioniert nicht, der meint es ist kein Pointer. v hab ich doch als pointer deklariert...
Gruss,
Cyrill
-
v ist ein Zeiger. v[irgendwas] aber nicht.
Kommt jetzt drauf an, was du mit Löschen meinst. Wenn du das Objekt wirklich löschen willst, mußt du ein neues Array anlegen, das um eins kürzer ist, und dann das alte Array da hineinkopieren. Sinnvoller wäre es allerdings einfach nur die size-Information anzupassen.
-
Stimmt ja

ja entweder ich erstelle einen neuen Zeiger um die Speicheradresse wieder frei zu geben oder ich setzte die size echt nur runter ist schneller gemacht
-
Hi,
wenn ich das hier mache, bekomme ich einen Heapspeicherfehler. Bzw. sobald ich v lösche.
template<typename T> void vector<T>::delete_last() { size--; T *v2; v2 = new T[size]; for (unsigned int a = 0; a <= size; a++) v2[a] = v[a]; delete v; v = new T[size]; for (unsigned int a = 0; a <= size; a++) v[a] = v2[a]; delete v2; }
-
Falsch:
a <= sizeRichtig:
a < sizeAbgesehen davon, sieht der ganze Code für mich ziemlich sinnlos aus. Warum legst du zwei neue Arrays an?
-
new -> delete
new[] -> delete[]
-
Z2 schrieb:
Warum legst du zwei neue Arrays an?
Weil ich kein einzelnes Element löschen kann. Ich hätte zwar nur die size heruntersetzen können, aber die elemente bleiben ja im Speicher. Wenn man es anders schreiben kann, dann würde ich es gerne anders machen...
Danke euch beiden...
Gruss,
Cyrill
-
Leg ein neues Array an, kopier den Inhalt des alten Arrays in das neue und ersetzte den Zeiger auf das alte Array durch den Zeiger auf das neue Array.
Übrigens ist den Code nicht Exception-sicher. Merke, nackte Zeiger sind gefährlich! Um das sauber zu machen, müßte man entweder einen geeigneten SmartPointer nehmen (std::auto_ptr ist hier nicht geeignet) oder einen try-catch-Block darum legen.
-
void Foo<T>::DeleteLast() { assert(m_usedElements > 0); m_usedElements--; (&m_buffer[m_usedElements])->T::~T(); }?