Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 19.08.2003, 17:35 Titel: Klassen "sammeln" |
|
|
folgendes...
Bei meinem Spiel soll man soviele Objekte wie man möchte auf den Bildschirm setzen können (und verwalten...)
Ich hab mir so überlegt, dass man für jedes Objekt eine Klasse erstellt...
Gibt es irgendeine Möglichkeit dass ich unendlichviele (oder ziemlich viele) Klassen speichern kann, dass ich nicht Millionen von Objekten verarbeiten muss sondern nur automatisch die Liste abarbeite...
Wenn das geht... Kann mir einer erklären wie?
(Am besten mit Quellcode... ) |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.08.2003, 17:48 Titel: |
|
|
Du erstellst dir ein Interface und leitest von diesem deine Klassen ab, etwa so:
Code: |
struct IBase
{
void MachWas() = 0;
}
class CBall : public IBase
{
public:
void MachWas()
{
cout << "*roll*" << endl;
}
};
...
|
Dann kannst du dir so eine Liste anlegen:
Code: |
list<IBase *> MeineObjekte;
MeineObjekte.push_back(new CBall());
MeineObjekte.push_back(new CBoomerang());
MeineObjekte.push_back(new CBaum());
|
Wenn du dann die Liste durchläufst und MachWas() aufrufst, wird immer die richtige Methode aufgerufen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.08.2003, 18:11 Titel: |
|
|
Ich hab dazu mal ein kleines Programm geschrieben.
Code: |
#include <iostream>
#include <list>
#include <algorithm>
#include <functional>
using namespace std;
// BASISKLASSE
struct IBase
{
virtual ~Base() { }
virtual void MachWas() = 0;
};
// ABGELEITETE KLASSEN
class CBall : public IBase
{
public:
CBall() { cout << "Ein Ball betritt die Spielwelt" << endl; }
virtual ~CBall() { cout << "Ein Ball verlässt die Spielwelt" << endl; }
void MachWas() { cout << "*roll*" << endl; }
};
class CPolizist : public IBase
{
public:
CPolizist() { cout << "Ein Polizist betritt die Spielwelt" << endl; }
virtual ~CPolizist() { cout << "Ein Polizist verlässt die Spielwelt" << endl; }
void MachWas() { cout << "STEHEN BLEIBEN! POLIZEI!" << endl; }
};
// FUNCTORS
// Ruft die Methode "MachWas" auf
template<typename T>
struct machwas : public unary_function<T, bool>
{
void operator()(T * a)
{
a->MachWas();
}
};
// Löscht ein Objekt
template<typename T>
struct delete_ : public unary_function<T, bool>
{
void operator()(T * a)
{
delete a;
}
};
void main()
{
list<IBase *> MeineObjekte;
MeineObjekte.push_back(new CBall);
MeineObjekte.push_back(new CBall);
MeineObjekte.push_back(new CPolizist);
for_each(MeineObjekte.begin(), MeineObjekte.end(), machwas<IBase>());
for_each(MeineObjekte.begin(), MeineObjekte.end(), delete_<IBase>());
}
|
[EDIT] DUMMEN Fehler beseitigt. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 20.08.2003, 06:53 Titel: |
|
|
Gibt es nicht eine Möglichkeit, das Analog zu den SDI Anwendungen (Serialisierung) zu machen? |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.08.2003, 09:06 Titel: |
|
|
Fragezeichen? Das ist normales C++.. sollte überall anwendbar sein. Kannst du deine Frage bitte nochmal anders stellen? Ich weiß nicht wirklich was du meinst. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 20.08.2003, 16:50 Titel: |
|
|
ei SDI Anwendungen kannst du ja Daten über die Serialisierung verabreiten und speichern... Ich bezweifel aber das das so einfach übertragbar ist, da das ja auf der Dokumentklasse beruht (und diese ja hier fehlt)... Und da kannst du ja auch unendlichviele Datensätze (Klassen) hinzufügen und frei verarbeiten...
Aber ich dachte so, dass es vielleicht etwas equävalentes dazu gibt... Aber ich werd jetzt erstmal deine Methode ausprobieren ob man damit auch das umsetzen kann, was ich will... |
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 21.08.2003, 18:25 Titel: |
|
|
@Hazel: Bei deinem Beispiel bringt er mir einen Fehler: "Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei"...
Geht auch glaub ich in eine andere Richtung als ich es brauche...
Mein Problem ist folgendes: Ich werde wahrscheinlich knapp hundert Klassen verwenden, die alle vom selben Typ, nur mit anderen Eigenschaften... Und ich bräuchte einfach eine Art Container, wo ich alle einspeichere und bei Bedarf mir die Klasse raussuche, die ich brauche und deren Daten verarbeite....
Wie geht das? |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.08.2003, 18:56 Titel: |
|
|
Sorry aber du benutzt einige Schlüsselwörter falsch... du meinst du willst Instanzen einer Klasse speichern. Was meinst du mit Eigenschaften? Als Container würde ich einfach eine std::list nehmen. Wenn du nach einer Instanz suchst kannst du den Algorithmus std::find benutzen(funktioniert genauso wie for_each, du musst halt nur ein anderes Funktionsobjekt übergeben). _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 21.08.2003, 19:08 Titel: |
|
|
Merk man so deutlich, dass ich keine Ahnung hab?
Als Beispiel:
Code: | class Haus
{
public:
void SetHaus(int x, int y)
{
Haus_X=x;
Haus_Y=y;
}
void Blt_Haus()
{
BltWohnhaus1(Haus_X,Haus_Y,3);
}
private:
int Haus_X;
int Haus_Y;
}; |
So... Nur halt en bissl komplexer soll die Klasse am Ende aussehen... Von dieser Klasse sollen jetzt mehrere Häuser abgeleitet werden, die sich einzig und allein in den unter private festgelegten Eigenschaften unterscheiden...
Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern und bei Bedarf zum Beispiel von einem bestimmten Hausobjekt die Variablen ändern...
Verstanden was ich meine? |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.08.2003, 19:51 Titel: |
|
|
Du willst deine Haus-Klasse als Basisklasse nehmen und verschiedene Haustypen ableiten, korrekt? Dann ist doch das Beispielprogramm, dass ich dir gegeben habe richtig?
Zitat: |
Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern
|
Das kapier ich nicht wirklich. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 21.08.2003, 20:00 Titel: |
|
|
Hazel hat Folgendes geschrieben: | Du willst deine Haus-Klasse als Basisklasse nehmen und verschiedene Haustypen ableiten, korrekt? Dann ist doch das Beispielprogramm, dass ich dir gegeben habe richtig?
|
Kann sein. Aber um dein Programm zu verstehen müsst es erstmal laufen...
Zitat: | Zitat: |
Ich will jetzt aber nicht 100 Hausobjekte erstellen, sondern die Variablen einfach speichern
|
Das kapier ich nicht wirklich. |
Ich will folgendes vermeiden:
Haus Haus1;
Haus Haus2;
Haus Haus3;
...
Haus Haus100;
Vor allem da der einzige Unterschied zwischen allen Hundert Häusern ein paar variablensind...
Ich will ungefähr sowas
Code: | Haus Whaus;
SetHaus(10,100);
Häusergruppe->Add(Whaus);
Haus Whaus2;
Whaus2=Häusergruppe->GetHaus(2); |
Also im endeffekt so, wie du bei der Serialisierung Objekte verwalten würdest... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 21.08.2003, 20:26 Titel: |
|
|
Genau das macht mein Beispiel...
Zitat: | "Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei"... |
Stell mal in deinem Projekt die vorkompilierten Header aus... wo du die Option findest weiß ich aber nicht aus dem Kopf. Und erstellst du auch eine Konsolenanwendung? Falls es nicht klappt, paste die #includes in den Header stdafx.h. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Zuletzt bearbeitet von Hazel am 21.08.2003, 21:10, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 21.08.2003, 20:35 Titel: |
|
|
Du findest dass in den C++ Optionen unter Projekt->Einstellungen. |
|
Nach oben |
|
 |
underberg JLI'ler
Anmeldedatum: 11.01.2003 Beiträge: 153
Medaillen: Keine
|
Verfasst am: 23.08.2003, 06:29 Titel: |
|
|
Code: | error C2523: 'IBase::~Base' : Name fuer Destruktor ungueltig |
Edit:Habs jetzt einfach rausgenommen und es läuft.. Jetzt muss ich es nur noch verstehen...
P.S. Könntest du mit dann auch mal schreiben, wie das GetHaus() bei deiner Funktion aussehen würde... Weil das Add() ist ja wohl mit pushback() unterstützt... |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 23.08.2003, 08:48 Titel: |
|
|
Ähm der Destruktor muss unbedingt wieder rein und zwar als virtual! Ich hatte nur einen Tippfehler drin. Es muss heißen
Code: |
struct IBase
{
virtual ~IBase() { }
virtual void MachWas() = 0;
};
|
Zu der GetHaus() Funktion:
Nach welchen Kriterien soll das Haus denn gesucht werden? Gibst du jedem Haus eine ID? _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
|