Dynamische "list" als statische Variable

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Dynamische "list" als statische Variable

    Hallo,
    Ich möchte in einer selbst geschriebenen C++-Klasse eine statische Variable anlegen.
    Diese soll eine Dynamische Liste sein, welche alle Instanzen der Klasse enthällt, so dass jede Instanz jede andere kennt.
    Probleme habe ich mit der C++ Syntax. Der Compiler meckert immer...
    Wäre nett, wenn jemand mal Beispielcode für die .h und die .cpp Datei schreiben könnte.
    Ich möchte <list> includen und eine Listen-Instanz, wie gesagt, static deklarieren.
    Die liste müsste dann eine "list<MeineKlasse>" sein. Geht das so einfach?
    Im Konstruktor der Klasse soll dann die Instanz selbst der Liste hinzugefügt werden.
    Geht das einfach mit this->klassenliste.insert(this) ???

    Vielen Dank schon einmal im Voraus!
    >: 4 8 15 16 23 42
  • Moin,

    findest du eine statische Variable macht hier wirklich Sinn?
    Zumal (ich habe es nicht getestet) eine Methode, welche die eigene Instanz an eine (statische) Variable der eigenen Instanz übergibt schon ziemlich gewagt ist.

    Warum erzeugst du die Liste nicht einfach in der main Methode und gibst nur einen Zeiger auf diese Liste in deine Klasse "Fisch" herein.

    Wenn du die Liste dann außerhalb/innerhalb änderst wissen alle Instanzen von "Fisch" auch von diesen Änderungen, da sie ja sowieso nur einen Zeiger auf die Liste haben.

    Und einklinken/ausklinken können sie sich auch selbst.
  • Also ich finde die Lösung eigentlich nicht schlecht. Schließlich wird der Konstruktor nur einmal aufgerufen und warum sollten sich die Fische dann nicht in die Liste einklinken?

    Bin mit der Syntax für die static-Variable endlich klar gekommen:

    ------Fisch.h:

    Quellcode

    1. #ifndef FISCH_H
    2. #define FISCH_H
    3. // hier kommen die spaeter benoetigten includes hin
    4. #include <stdio.h>
    5. #include <GL/glut.h>
    6. #include <list>
    7. using namespace std;
    8. class Fisch
    9. {
    10. // oeffentlich sichtbarer Teil
    11. public:
    12. Fisch(); //Standardkonstruktor
    13. ...
    14. // nicht oeffentlich sichtbarer Teil
    15. private:
    16. static list<Fisch> fischliste;
    17. ...
    18. };
    19. #endif
    Alles anzeigen


    ------Fisch.cpp:

    Quellcode

    1. #include "Fisch.h"
    2. #include <stdio.h>
    3. #include <GL/glut.h>
    4. #include <list>
    5. using namespace std;
    6. //Dynamische Liste aller Fische
    7. list<Fisch> Fisch::fischliste;
    8. ...
    9. ...//Variablen
    10. Fisch::Fisch(void)
    11. {
    12. }
    13. Fisch::Fisch(GLfloat fifa[4], GLfloat flofa[4], float pos[3])
    14. {
    15. ...
    16. ...
    17. this->fischliste.push_back(this); //Hier wird der Fisch hinzugefügt
    Alles anzeigen



    Leider bekomme ich nun die Fehlermeldung:

    'std::list<_Ty>::push_back': Konvertierung des Parameters 1 von 'Fisch *const ' in 'const Fisch &' nicht möglich
    with
    [
    _Ty=Fisch
    ]
    Ursache: Konvertierung von 'Fisch *const ' in 'const Fisch' nicht möglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig

    Hat jemand eine Idee?
    >: 4 8 15 16 23 42
  • Probiers aus ;)

    Vielleicht reicht es im Konstuktor liste->add(this) aufzurufen.
    Vielleicht musst du es eben auch in der Main Methode machen.

    Quellcode

    1. Fisch* f = new Fisch(liste);
    2. liste->add(f);


    //EDIT
    Das oben bezieht sich noch auf den vorletzten Beitrag.
    Zu deinem letzten: Versuch mal anders zu initialisieren

    Quellcode

    1. list<Fisch*> Fisch::fischliste;
  • DjRAST schrieb:

    Habe es gerade in Java ausprobiert und es hat wunderbar funktioniert (eine Instanz mittels this an eine statische Variable ihrer Klasse übergeben). Prinzipiell ist das also schon möglich. C++ sucks!
    Nur weil du C++ nicht kannst, musst du nicht so darüber urteilen. Echt lächerlich.