Zeiger auf Zeiger, Zugriffsverletzung



  • Cypher schrieb:

    aber wenn trotzdem jemand weiß was da oben falsch ist

    Ist das Absicht, dass du einmal count benutzt, und einmal imagecount?



  • nein, hab mich nur vertippt, weil in meiner anwendung, gehts speziell um eine liste aus bildern.

    äh, nochwas: hat vllt. jemand einen link wie ich mit std::vector umgehe?
    hab bis jetzt nichts brauchbares finden können



  • Du kannst die Klasse std::vector so wie normale Arrays benutzen. Nur das deklarieren sieht ein wenig anders aus:

    std::vector<datentyp_den_der_vektor_speichern_soll> myVector(anzahl_der_elemente_des_vektors); // Es gibt jedoch noch mehr Konstruktoren. (Auch einen Default Ctor.)
    

    Nun greifst du mittels des []-Operators normal auf die einzelnen Elemente zu. Wenn du ein vektor-element hinten anhängen willst, kannst du myVektor.push_back(element) schreiben. (Das ist vorallendingen sinvoll bei einem zur Deklaration leeren Vektor).

    Für den Rest bzw. die extra-Funktion kannst du mal hier schauen: http://www.cppreference.com/cppvector/

    Caipi



  • ok, danke.
    in dem fall für das ich so eine liste brauche wäre es praktisch, wenn ich eine klasse von diesem std::vector ableiten könnte.
    allerdings ist das ja keine "normale" klasse oder?
    also ich denke dabei daran wie man einen vector deklariert (mit diesem <typ>) und wie man die elemente aufruft.
    kann ich da trotzdem einfach eine klasse davon ableiten?
    also

    class foobar : public std::vector {
    foobar();
    void myfunction();
    }
    


  • Ableiten kannst du. Aber IST deine abgeleitete Klasse ein Vektor, oder HAT sie nur einen, mit dem du arbeiten willst? Das muss dir bewusst sein. Ich denke, dass sie nur ein hat. Das machst du am besten mit Layering. Das geht so:

    class myclass
    {
        private:
            std::vector<T> vec; // hat ein
    };
    

    myclass hat als Member ein Objekt vom Typ std::vector<T>.



  • es wäre gut wenn die abgeleitete klasse ein vektor sein könnte.
    aber notfalls kann ichs auch so machen 🙂



  • 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 passen 😃

    Leider 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 zeigen 😉

    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. 🙂

    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 gemacht 🙂

    Tue 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 linkerfehler 😮

    Lese dir das hier durch: http://www.c-plusplus.net/forum/viewtopic-var-t-is-105732.html
    Darüber habe ich nun schon genug geschrieben. 😉


Anmelden zum Antworten