PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] statische klassen variablen initialisieren



Alex_K
28-07-2004, 09:04
ich gebe am besten gleich ein beispiel:



class a
{
static B *var;
public:
//irgendwelche funktionen
};


also ich habe eine klasse A, welche eine statische variable vom typ B hat. ich will das alle instanzen von A mit dem gleichem objekt vom typ B arbeiten.

wenn ich davon ausgehen könnte das *var == 0, dann wäre es einfach möglich im konstruktor das objekt B nur zu erzeugen wenn *var == 0.
aber laut stroustrup darf ich nicht einfach static B *var = 0; schreiben, so eine initialisierung ist nur erlaubt wenn die variable auch const ist.

die möglichkeit die mir einfällt wäre eine statische init funktion zu schreiben, die vor dem verwenden dieser klasse aufgerufen werden muss, doch ich finde das ist keine wirklich schöne lösung.
hat jemand eine idee wie man das besser lösen könnte?

wraith
28-07-2004, 09:27
wenn ich davon ausgehen könnte das *var == 0, dann wäre es einfach möglich im konstruktor das objekt B nur zu erzeugen wenn *var == 0.

Du meinst var == 0, der Zeiger soll auf 0 zeigen, nicht die Dereferenzierung (das Objekt selbst) gleich 0 sein.


aber laut stroustrup darf ich nicht einfach static B *var = 0; schreiben, so eine initialisierung ist nur erlaubt wenn die variable auch const ist.

Für eine static Variable mußt du erst noch Speicher reservieren.
Bsp.


class a
{
static B *var;
public:
//irgendwelche funktionen
};

B *a::var; /* = 0 unnötig da static automatisch 0*/

Die letzte Zeile muß in _einer_ cpp Datei stehen, dh. pack sie am besten in die zugehörige a.cpp Datei.



hat jemand eine idee wie man das besser lösen könnte?
Wenn du schon zur Compilezeit weißt, welcher Konstruktor mit welchen Werten aufgerufen werden soll, dann brauchst du keinen Zeiger.


class B {

public:
B(int,float) {}
};

class a
{
static B b;
public:
//irgendwelche funktionen
};

B a::b(10,1234.0f);

Alex_K
28-07-2004, 09:49
Du meinst var == 0, der Zeiger soll auf 0 zeigen, nicht die Dereferenzierung (das Objekt selbst) gleich 0 sein.

ja, das meine ich.



Für eine static Variable mußt du erst noch Speicher reservieren.

danke, jetzt ist mir auch klar von wo die linkerfehler kommen. ;)



Wenn du schon zur Compilezeit weißt, welcher Konstruktor mit welchen Werten aufgerufen werden soll, dann brauchst du keinen Zeiger.

das weiß ich leider nicht, aber wenn ich davon ausgehen kann dass static pionter immer null sind, dann ist das ganze sowieso kein problem.

nochmal danke für die schnelle hilfe