PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++: Zugriff, bzw. Zählen von Objektinstanzen



stefan-tiger
01-06-2005, 11:58
Hallo,

Eine Verständnisfrage:

Wenn ich in C++ Objektinstanzen Anlege:

A a;
B b;
A c;
A d;
B e;

Dann hab ich ja drei Objekte vom Typ A und zwei vom Typ B.

Wie kann ich nun feststellen wieviel A Instanzen es gibt, bzw. auf a,c,d gleichzeitig zugreiffen?

Muss ich dafür z.B: mit einem Array von Pointern selbst dafür sorgen und mir z.B. in einem "int" die Anzahl merken, oder gibts einen anderen Weg? (ich mein jetzt nicht verkettete Listen)

Gruß

Joghurt
01-06-2005, 12:08
Google mal nach Factory Classes.

Boron
01-06-2005, 12:30
class A
{
private:
static int numberOfAs = 0;

public:
A() {
numberOfAs++;
// restlicher Code des Konstruktors
}

~A() { numberOfAs--; }

static int getNumberOfAs() { return numberOfAs; }
};Kann das so funktionieren?

numberOfAs ist einen Klassenvariable. Das heißt, dass sie nur ein einziges mal pro Klasse existiert, unabhängig davon wie viele Objekte es von dieser Klasse gibt.

Jeder Konstruktoraufruf (Erstellen eines neuen Objekts) erhöht die Anzahl.
Der Destruktor zieht wieder was ab.
Abgefragt wird die Anzahl im Code mit A::getNumberOfAs();

stefan-tiger
01-06-2005, 12:47
...
Kann das so funktionieren?
...

Die Idee Find ich gut, jedoch "denkt" der Kompiler immer bei "static" es sei eine Funktion (auch ohne runde Klammer), die dann beim Linken nicht gefunden wird

Das mit der Factroy Class muss ich mir mal anschauen.

michael.sprick
01-06-2005, 13:06
Ich habe das in einer Klausur damals mal so gemacht:



class A
{
public:
A();
~A();
static int Population;
};

int A::Population;

A::A()
{
Population++;
}

A::~A()
{
Population--;
}

int main()
{
A o1;
A o2;
A o3;
printf("Es gibt insgesamt %d A-Objekte", A::Population);
return(0);
}


Es hat auch funktioniert - ich weiß aber nicht, ob da irgendwas schiefgehen kann...

Boron
01-06-2005, 13:16
In Bezug auf den Code von michael.sprick:
Ich glaube, dass integer Klassenvariablen automatisch mit 0 initialisiert werden. Deshalb ist das "= 0" in meinem Code nicht notwendig.

Die "Population" ist public bei dir.
Besteht da nicht die Gefahr, dass sie von außen verändert wird, obwohl weder Objekte angelegt, noch gelöscht werden?

michael.sprick
01-06-2005, 13:39
die Gefahr besteht natürlich... aber man kann sie ja auch private machen und eine Get-Methode schreiben so wie in Deinem code...
Was ich eigentlich zeigen wollte: Wenn man einen static Member machen will, muss man ihn scheinbar auch außerhalb der Klasse deklarieren...

stefan-tiger
01-06-2005, 15:24
..
Was ich eigentlich zeigen wollte: Wenn man einen static Member machen will, muss man ihn scheinbar auch außerhalb der Klasse deklarieren...

Funktioniert bei mir trotzdem nicht, schon alle Varianten probiert

static int n;
int A::n;

static int n=0;
int A::n;

static int n;
static int A::n;

static int n;
static int A::n=0;

usw.

Immer ein Fehler, das ISO C++ irgendwas verbietet, oder etwas mehrfach deklariert ist.

Gruß

michael.sprick
01-06-2005, 15:33
bei mir gehts - aber auch nur diese eine Variante:



class A
{
private:
static int Population;
};
int A::Population;
bzw.
int A::Population=0;


Bist Du sicher, dass Du die klasse mit einem Semikolon zu gemacht hast?

anda_skoa
01-06-2005, 15:57
muss man ihn scheinbar auch außerhalb der Klasse deklarieren...

Definieren.

Deklariert ist sie schon, aber da sie static ist und nicht an eine Instanz gebunden ist, muß man irgendwo Speicher für sie definieren.

Btw, da Problem ist aber dann noch, daß Subklassen von A auch als A's gezählt werden (was ansich nicht falsch ist), aber vielleicht möchte man das nicht.

Außerdem löst das noch nicht die Frage wie man dann auf alle A Instanzen zugreift :)

Ciao,
_

stefan-tiger
06-07-2005, 15:00
Ich weiß worans bei mir lag.

Die Definition der static Variablem darf nicht in der Headerdatei stehen, in einer cpp Datei funktionierts.

locus vivendi
06-07-2005, 16:25
Die Definition der static Variablem darf nicht in der Headerdatei stehen, in einer cpp Datei funktionierts.
Eine Anmerkung dazu, weil die Aussage so pauschal ist:
In einem C++ Programm darf die Definition eines Objekts oder einer nicht-inline-Funktion nur genau einmal vorkommen, wenn dieses Objekt oder diese Funktion benutzt wird. Und dann gibt es noch einige Regeln, die Definitionen in Zusammenhang mit Templates, sowie von Klasen,inline-Funktionen usw. ... behandeln. Diese Regeln laufen, da werde ich jetzt ungenau, darauf hinaus dass man von diesen "Objekten" nur eine Definition in einer Übersetzungseinheit haben darf. Zusammengefasst werden diese Regeln als "One definition rule" bezeichnet, und sind ein wichtiges Konzept, dass man m.E. im Hinterkopf behalten sollte.