Spezieller Code bei erster Konstruktion einer Instanz
-
Hi!
Gibt es eine elegante Möglichkeit Code nur einmal bei der ersten Kontruktion einer Instanz auszuführen,
ohne so ein lästiges Konstrukt wie dieses zu verwenden?class Foo { static bool FirstCreation; public: Foo() { if(FirstCreation) { //Mach blablabla FirstCreation = false; } else { //Normale Konstruktion... } } }; bool Foo::FirstCreation = true;
Danke für jede Hilfe
KaPtainCugel
-
könnte mit einer statischen Variable im Konstruktor gehen:
class Action { public: Action(); }; Action::Action() { // was du halt bei der ersten Konstruktion machen willst } class Foo { public: Foo() { static Action action; // rest der Konstruktion } };
action wird beim ersten Aufruf des Foo-Konstruktors erzeugt, d.h. der Konstruktor von Action wird aufgerufen ... und da kann allerhand passieren. Wenn dir das nicht ausreicht, musst du auf deine Variante ausweichen, die ich im übrigen nicht "lästig" finde ...
-
und da kann allerhand passieren
Was meinst du damit?
-
Danke Bashar deine Lösung gefällt mir schon ein wenig besser, ich versuche allerdings mal das Problem ein wenig genauer zu beschreiben, vielleicht habt ihr ja eine bessere Idee und ich brauch diesen static Kram gar nicht:
Ich habe verschiedene Viewklassen(sollen Gebrauch von der QT machen), die sollen alle ein Bild anzeigen können (QPixmap), das sieht in etwa so aus:
class GameObjectView { public: GameObjectView(); virtual ~GameObjectView(); virtual void Draw() const = 0; };
Davon werden dann die verschiedenen Klassen PlayerView, StoneView, etc. abgeleitet. Jetzt muss aber jede Methode beim Zeichnen das entsprechende QPixmap zeichnen, da ich aber nicht unnötig Speicher verschwenden will, spendiere ich nicht jeder Instanz ein eigenes Pixmap(alle Steine sehen schließlich gleich aus).
Ich dachte mir also ich erstelle einen PixmapManager(ein Singleton), der mit Hilfe eines Hashwertes das entsprechende QPixmap zurückgibt:
QPixmap& PixmapManager::GetPixmap(int HashValue);
Natürlich muss ich auch irgendwann einmal festlegen, welcher Hashwert zu welchem Pixmap gehört, außerdem brauche ich dann den Pfad zu der Pixmap und genau da liegt mein Problem:
1. Wer legt das fest? Macht das also der PixmapManager(dann kennen die Views ihren Hashwert aber nicht) selbst oder fordern die einzelnen Viewklassen ihn dazu auf(das würde mit obigem Konstrukt gehen) oder erstelle ich vielleicht sogar eine eigene Klasse dafür, die das macht.2. Wann wird es festgelegt.
Vielleicht kann mir jemand ein paar Anregungen dazu geben, da ich von der Lösung mit dem einmaligen Ausführen des Codes im Konstruktor nicht ganz glücklich bin.
Dankeschön
KaPtainCugel
-
Ich würd's so machen:
Objekt wird konstruiert und teilt dem BitmapManager mit, welches Bitmap es braucht (z.B. Dateiname). Der BitmapManager schaut nach, hab ich schon, hier ist Deine ID bzw. stellt fest muß noch geladen werden, verpaßt dem frisch geladenen Bild ebenfalls ne ID und gibt die dann zurück.
Das Objekt selbst merkt sich dann einfach nur noch die ID.MfG Jester
-
Das heißt du würdest jeder Instanz die int Variable mit Hashwert mitgeben(bzw. wie du gesagt hast vom BitmapManager zuweisen lassen) oder das ganze über eine static Membervariable lösen, um vielleicht ein wenig Speicher zu sparen?
-
Hallo,
also ich würde es so machen.
Die Klasse, die die einzelnen Bilder beinhaltet, soll eindeutige IDs ausgeben (was du dafür auch immer nimmst).
Wenn du dann eine Klasseninstanz von GameObejctView oder einer Abgeleiteten machst, übergibst du die ID.
Nun kann, wenn das Bild gezeichnet werden soll, deine Instanz von GameObjectView über die Klasse, die die Bilder hat, das Bild zeichnen.
Villeicht habe ich auch etwas falsch verstanden.MfG MAV
-
@KPC:
Durch dieses Speicher sparen wirst Du halt auch etwas unflexibel. Alle Objekte einer Klasse zeigen verwenden dann stets das selbse Bild.
Wenn jedes seine eigenen ID hat kann ich folgendes machen:Object o1("Mauer.bmp");
Object o2("Felsen.bmp");
etc. die Objekte verhalten sich alle gleich, sehen nur leicht verschieden aus. Das ist mit dem Ansatz über die static-Variable nicht möglich.MfG Jester
-
Gut danke für die Ideen, die Lösung von Jester gefällt mir doch recht gut, ich hatte bis jetzt nur immer Angst dass es vielleicht ineffizient ist, da ich ja bei jeder Konstruktion eines Objektes erstmal im BitmapManager nachgucken muss, ob das entsprechende Bild nicht schon geladen ist.
Aber gab es da nicht mal so einen schlauen Satz: premature optimization is the root of all evil