Hallo Semjon!
Zunächst folgendes: Ich habe im ersten Posting versucht das ganze vereinfacht darzustellen und habe dazu „Liste“ und „Element“ als Bezeichnungen gewählt. In der Klassendeklaration weiter unten werden stattdessen die Bezeichnungen „CListe“ und „CStein“ (entspricht dem Element) auftauchen. Ebenfalls heißt „listenanker“ dort „sl“.
Wo kommen denn die Listenelemente
her? Aus ‚next = new element;‘ ?
Die Elemente (Steine) werden in einer Funktion „macheSteine()“ mit „new“ erzeugt und dann über eine Funktion „insertListe()“ an das Ende der Liste geknüpft (d.h. an den „next“-Zeiger des letzten Listenelements).
Gibt es Konstruktoren oder Destruktoren
für ‚Element‘? Wie sehen die aus?
Kannst Du bitte (neben Deiner Intention
zum Zweck des Programms und seines komplizierten
Designs) alle relevanten Klassendeklarationen
sowie Konstruktoren/Destruktoren posten?
Intention: Das Programm ist als Übung gedacht und soll eine Art vereinfachtes Tetris ergeben (ich nehme an du kennst Tetris). Dabei fallen die Steine von oben herab, bis sie unten den Bildschirmrand erreichen, bzw. mit einem anderen Stein kollidieren. Diese Steine (CStein) werden in der einfach verketteten Liste (CListe) gespeichert (Vorgabe!). Wenn bestimmte Bedingungen eintreffen, sollen einzelne Steine wieder gelöscht werden und somit auch nicht mehr auf der Oberfläche dargestellt werden. Die Klasse „View“, die nachfolgend auftaucht, dient zur Prüfung, ob es Kollisionen zwischen den einzelnen Steinen gibt.
Nachfolgend die Headerdateien für CStein und CListe:
class CStein
{
private:
int x;
int y;
int breite;
int hoehe;
char farbe;
CStein * next;
View * v;
public:
CStein();
CStein(int x, int y, int breite, int hoehe, char farbe, View * v);
void setX(int x);
void setY(int y);
void setBreite(int b);
void setHoehe(int h);
void setNext(CStein * n);
void setView(View * v);
int getX() const;
int getY() const;
int getBreite() const;
int getHoehe() const;
int getFarbe() const;
CStein * getNext() const;
void show() const;
void showGUI(HDC hdc) const;
bool kollision(CStein * s) const;
void dropOneLine();
void cutOneLine();
};
= = = = = = = = = =
class CListe
{
private:
CStein * sl;
View * v;
void copy(View * v, CStein * &sl, CListe &original);
void cutLine(int i, HWND hWnd);
void deleteStein(CStein * a);
public:
CListe();
CListe(CListe &original);
CListe & operator=(CListe &original);
~CListe();
void clearListe();
void insertListe(CStein * s);
void showListe(HWND hWnd) const;
int animateListe(HWND hWnd, CStein * s, char richtung);
bool kollision() const;
CStein * const getSL() const;
View * const getView() const;
void checkLines(HWND hWnd);
};
Konstruktoren CStein:
CStein::CStein()
{
x=0;
y=0;
breite=0;
hoehe=0;
farbe=177;
next=NULL;
v=NULL;
}
CStein::CStein(int x, int y, int breite, int hoehe, char farbe, View * v)
{
this->x=x;
this->y=y;
this->breite=breite;
this->hoehe=hoehe;
this->farbe=farbe;
next=NULL;
this->v=v;
} Destruktor CStein:
Ich habe KEINEN Destruktor für CStein implementiert, d.h. ich benutze den Standard-Destruktor der vom Compiler gestellt wird. Mein Gedanke dahinter: obwohl ein Stein Zeiger auf Heap-Objekte enthält (next, v), sollen diese beim Vernichten des Steins nicht gelöscht werden, da sie ja noch vom Programm verwendet werden. (Liegt hier etwa mein Fehler?)
Konstruktor CListe:
CListe::CListe()
{
sl=NULL;
this->v=new View();
v->clear();
} Destruktor CListe:
CListe::~CListe()
{
if(sl!=NULL){clearListe();}
delete v; v=NULL;
}
So, ich hoffe das hilft weiter.
MfG,
0nyx