Zeiger auf Zeiger, Zugriffsverletzung
-
Cypher schrieb:
aber wenn trotzdem jemand weiß was da oben falsch ist, bzw. den unterschied zwischen diesen beiden möglichkeiten kennt, würd mich das trotzdem noch interessieren
Nun, mit den bisschen Code von dir kann man das nicht wirklich sagen. Da müsstest du schon mal mit dem Debugger durchgehen und die genaue Zeile herausfinden. Ansich sehe ich an dem Code keinen Fehler. Trotzdem noch 3 Anmerkungen:
1. Normalerweise verwendet man in C++ ja new für dynamische Speicherreservierung. Und es ist nirgendwo festgelegt, dass die ...alloc Funktionen sich damit vertragen.
2. Hast du count auch schön genullt bei der Instanzierung?
3.foobar = (ObjectTyp**)realloc(foobar, count*sizeof(ObectTyp*));
ist nicht ganz sauber. Sollte der relativ unwahrscheinliche aber durchaus mögliche Fall eintreten, dass realloc fehlschlägt, dann ist foobar futsch, der Speicher dahinter aber immer noch gültig.
-
Ist deine abgeleitene Klasse ein Vektor oder ist sie nur damit implementiert?
Wozu brauchst du eigentlich die Klasse? std::vector<T> reicht doch völlig aus. Notfalls nimmste halt einen anderen Container.
-
hab jetzt ungefähr rausgefunden, wie ich eine Klasse von std::vector ableite, aber
wenn ich das hier kompilieren will bekomm ich einen "Syntaxfehler vor ::"template<class T> class CList : public std::vector<T> { void Add(T obj); }; void CList::Add(T obj) { // Das ist die Zeile in der der Fehler ist. push_back(obj); }
Das is nur ein Versuch, ich will die Klasse schon auch noch um andere Dinge erweitern *g*
aber erst mal möchte ich eine Klasse, die mir zu vector einträge hinzufügen und löschen kann, nur mit Funktionsnamen, die besser zu meinen restlichen passen
-
Schau dir mal an wie man Methoden von template Klassen ausserhalb der Klassendefinition implementiert.
Warum ist der vector kein Member von deiner Klasse? Die Funktion Add() ist ja schon überflüssig, da vector push_back() hat.
-
#include <vector> // ... template<class T> class List : public std::vector<T> { public: void Add(T obj); }; template <class T> void List<T>::Add(T obj) { push_back(obj); } // ...
Warum ein "C" vorm Klassenname?
Das is nur ein Versuch, ich will die Klasse schon auch noch um andere Dinge erweitern *g*
aber erst mal möchte ich eine Klasse, die mir zu vector einträge hinzufügen und löschen kann, nur mit Funktionsnamen, die besser zu meinen restlichen passenLeider gibt es noch kein template typedef im Standard, denn sonst würde so was gehen:
template <class T> typedef std::vector<T> List;
Aber nur wegen Funktionsnamen von std::vector ableiten? Weiß auch nicht ob das so gut ist.. Portabel bleibt du garantiert mit push_back() etc., was ist da auszusetzen?
-
ich bin im moment dabei ein ganzes arsenal an klassen zu schreiben, und die haben alle Was die Funktionsnamen angeht ähnlichkeiten und die würde ich beibehalten.
Außerdem seh ich diese Klasse atm noch als Übung an, ich will aber eine Bilderliste implementieren, die die Bilder auch direkt zeichnet etc. und ich denke es ist mit ableitung sinnvoller/übersichtlicher.
naja, wird sich zeigenich würde mir auch gerne "anschauen", wie man templateklassen implementiert, ahb dazu aber bis jetzt noch kein verständliches (/knappes
) tutorial gefunden. naja ihr habt mir ja gut geholfen bis jetzt, mal sehen wie weit ich mit den neuen erkenntnissen komm.
hauptsächlich will ich ja lernen
zu dem "C"... ich hab von Anfang an ein "C" vor all meine Klassennamen gesetzt (warum ich das angefangen hab weiß ich auch nicht
) also bekommt die auch eins.
Ich denke das Hab ich gemacht, weil alle SDL-Funktionen (und SDL ist das wofür der ganze aufwand ist) mit "SDL_" anfangen, hab ich halt auch irgendetwas vor meine Klassen gemacht
-
Cypher schrieb:
ich würde mir auch gerne "anschauen", wie man templateklassen implementiert, ahb dazu aber bis jetzt noch kein verständliches (/knappes
) tutorial gefunden. naja ihr habt mir ja gut geholfen bis jetzt, mal sehen wie weit ich mit den neuen erkenntnissen komm.
Templates sind ein komplexes Thema. Meinst du, dort reicht ein Tutorial aus? Besonders cool wird es, wenn du dir die Sachen von Andrei Alexandrescu (Modern C++ Design) anschaust. Das ist verrückt, was man damit alles machen kann. Man braucht aber lange, bis man das alles verstanden hat.
hauptsächlich will ich ja lernen
zu dem "C"... ich hab von Anfang an ein "C" vor all meine Klassennamen gesetzt (warum ich das angefangen hab weiß ich auch nicht
) also bekommt die auch eins.
Ich denke das Hab ich gemacht, weil alle SDL-Funktionen (und SDL ist das wofür der ganze aufwand ist) mit "SDL_" anfangen, hab ich halt auch irgendetwas vor meine Klassen gemachtTue alle deine Klassen in einen eigenen Namensraum rein. (sowie es auch die Standard Bibliothek macht)
namespace C { class List {}; } // irgendwo C::List foo; // oder using C::List; // using Deklaration List foo; // so wie auch using namespace C; // using Direktive List foo;
-
Cypher schrieb:
template<class T> class CList : public std::vector<T> { void Add(T obj); };
Sowas ist keine gute Idee. Entweder du benutzt dafür non-public Vererbung oder Layering. Das hängt davon ab, ob eine "ist ein"- oder "hat ein"-Beziehung vorliegt, oder ob du mit virtuellen Methoden arbeitest.
-
Zur Beachtung:
Da die STL-Container üblicherweise auch keine virtuellen Destruktoren haben
kannst du bei Vererbung auch nicht mit base-class Pointern arbeiten. (Polymorphie)
-
ihr sprecht in räzeln
was sind "base-class Pointer"?btw. kanns sein, dass solche template klassen probleme damit haben wenn man sie in source und header datei aufteilt?
wenn ich das tue bekomm ich irgendwelche linker fehler die mir nichts sagen.
wenn ich statt dessen die definition der funktionen unter die klassendefinition in die headerdatei schreibe und in die .c-Datei nur "#include <headerfile.h>" dann bekomm ich keine linkerfehler
-
Cypher schrieb:
ihr sprecht in räzeln
was sind "base-class Pointer"?Ein Zeiger, der auf eine Klasse zeigt, die eine Basisklasse von einer anderen ist.
btw. kanns sein, dass solche template klassen probleme damit haben wenn man sie in source und header datei aufteilt?
wenn ich das tue bekomm ich irgendwelche linker fehler die mir nichts sagen.
wenn ich statt dessen die definition der funktionen unter die klassendefinition in die headerdatei schreibe und in die .c-Datei nur "#include <headerfile.h>" dann bekomm ich keine linkerfehlerLese dir das hier durch: http://www.c-plusplus.net/forum/viewtopic-var-t-is-105732.html
Darüber habe ich nun schon genug geschrieben.