Statische Attribute in typedef struct

Jacal

Mitglied
Hallo,

Ich habe meiner typedef struct ein Statisches Attribut hinzugefügt.

Code:
typedef struct
{
     static int anz;
} BRICK;

Danach wollte ich folgendermaßen auf dieses Attribut zugreifen:
Code:
void new (BRICK brick)
{
      brick.anz++;
}

Allerdings liefert der GCC-Compiler den Fehler "undefined referenz to BRICK::anz".
Warum kann ich nicht auf das Attribut anz zugreifen?

Mfg, Jacal
 
Moin,

um es etwas klarer zu sagen, es fehlt vermutlich etwas in der Art wie
Code:
...
typedef struct
{
     static int anz;
} BRICK;
...
void new (BRICK brick)
{
      brick.anz++;
}
...
BRICK myStruct;
new( myStruct );
...

wobei ich mich gerade frage, ob Dein Inkrementieren überhaupt außerhalb der Funktion "new" ankommt. Ich würde den Struct entweder als Zeiger übergeben oder inner von "new" einen Rückgabecode einbauen!

Gruß
Klaus
 
Hi.
um es etwas klarer zu sagen, es fehlt vermutlich etwas in der Art wie
Nein, es fehlt (höchstwahrscheinlich) einfach die Definition des statischen Attributs:
C++:
int BRICK::anz = 0;
wobei ich mich gerade frage, ob Dein Inkrementieren überhaupt außerhalb der Funktion "new" ankommt.
Es handelt sich um ein statisches Attribut, d.h. es existiert unabhängig von jeder Instanz der Klasse - man benötigt nichtmal eine Instanz.

\edit: @Jacal: warum verwendest du das typedef struct ... Konstrukt in C++? Du kannst doch einfach schreiben:
C++:
struct BRICK { 
  ...
};
Gruß
 
Zuletzt bearbeitet:
Moin deepthroat,

oh, das war mir so auch neu :eek:
Hab's gerade mal ausprobiert und es stimmt - wieder was gelernt :)

Jetzt frage ich mich nur, warum ich dann überhaupt noch den umliegenden Struct brauche ... Dann würde doch ein einfaches Deklarieren der int-VAR reichen, oder ? :confused:

Gruß
Klaus
 
Moin deepthroat,

oh, das war mir so auch neu :eek:
Hab's gerade mal ausprobiert und es stimmt - wieder was gelernt :)

Jetzt frage ich mich nur, warum ich dann überhaupt noch den umliegenden Struct brauche ... Dann würde doch ein einfaches Deklarieren der int-VAR reichen, oder ? :confused:
Das wäre allerdings unsauber. Und normalerweise würde man das Attribut auch nicht public machen.

Gruß
 
Hallo,

Das wäre allerdings unsauber
Das verstehe ich jetzt zugegebenermaßen nicht!

Worin besteht denn der Unterschied zwischen
Code:
typedef struct
{
     static int anz;
} BRICK;
und
Code:
static int anz;

vom Zugriff darauf mal abgesehen ? ? ? :confused:

gruß
Klaus
 
Hi.
Das verstehe ich jetzt zugegebenermaßen nicht!

Worin besteht denn der Unterschied zwischen
Code:
typedef struct
{
     static int anz;
} BRICK;
und
Code:
static int anz;

vom Zugriff darauf mal abgesehen ? ? ? :confused:
Wenn man die Anzahl der Instanzen einer Klasse zählen will, dann gehört diese Eigenschaft einfach zur Klasse (weswegen man auch von einem Klassenattribut spricht).

Eine globale Variable hat mit der Klasse nichts zu tun, ist von überall zugreifbar und veränderbar. Deswegen kapselt man das Attribut mit in der Klasse (OOP Prinzip).

Und nicht zuletzt hat das Schlüsselwort static im globalen Skopus eine andere Bedeutung als innerhalb einer Klasse oder Funktion.

Gruß
 
Hallo,
ok,. ich gehe auch durchaus davon aus, dass es sich um ein Klassenattribut handelt .... und dass es dann vielleicht auch private sein sollte, ist sicher unbestritten!

Nur, nochmals gefragt: ob ich eine Integer-VAR deklariere oder diesen Struct mit der Integer-VAR, sollte sich doch vom Zugriff darauf abgesehen, gleich bleiben ...... :confused:
Was konkret bringt mir hier der Struct? ? ?
Wenn ich den Wert von außerhalb der Klasse abfragen will, benötige ich doch eh' eine entsprechende get-Funktion, die mir nur den Integer-Wert zurückliefert!

Gruß
Klaus
 
Nur, nochmals gefragt: ob ich eine Integer-VAR deklariere oder diesen Struct mit der Integer-VAR, sollte sich doch vom Zugriff darauf abgesehen, gleich bleiben ...... :confused:
Was konkret bringt mir hier der Struct? ? ?
In diesem konkreten Fall bringt der Struct gar nichts. Es handelt sich hierbei sicherlich um ein übermäßig vereinfachtes Beispiel, so das sich die Frage eigentlich gar nicht stellt ob es etwas bringt. Der Struct hat hier lediglich die Funktion eines Namensraums.
Wenn ich den Wert von außerhalb der Klasse abfragen will, benötige ich doch eh' eine entsprechende get-Funktion, die mir nur den Integer-Wert zurückliefert!
Ja, und was willst du jetzt damit sagen?

Gruß
 
Zurück