PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : static Variable in einem struct



barton4
03-10-2006, 20:14
Ich will ein struct haben das eine staic Variable enthält. Die statiche Variable soll dann durch ein Funktion kontrolliert werden.

hier erstmal der quelltext:

main.cpp:



#include "types.h"




int main()
{
foobar();

}




-----------------------------------------------------------------------
dann die header datei types.h:



#ifndef TYPES
#define TYPES 1



struct CTypes
{
static int anzahl;
int foo;
int irgendwas;
};

int CTypes::anzahl=0;

int foobar();



#endif

-------------------------------------------------

und zum schluss noch die types.cpp:



int foobar()
{
CTypes::anzahl++;
}








wenn ich es komplieren will kommt:
g++ -c types.cpp;g++ main.cpp types.o
types.o(.bss+0x0): multiple definition of `CTypes::anzahl'
/tmp/ccK3BVur.o(.bss+0x0): first defined here
collect2: ld returned 1 exit status


mhhh, wenn ich bei "int CTypes::anzahl=0;" das int aber weglass meckert er auch..
Und wenn ich die "int CTypes::anzahl=0;" ganz weg lass dann ist die statische Variable ja nicht zugeweisen
auch das zuweisen der 0 gleich im struct ist nicht gestattet




mhhh, ich weis echt nich weiter wie das gehen soll..

anda_skoa
03-10-2006, 20:43
Das hier


int CTypes::anzahl=0;


Muß in die types.cpp Datei

Ciao,
_

locus vivendi
04-10-2006, 12:31
Die Lösung des Rätsels wurde bereits gepostet, aber zwei Anmerkungen hätte ich noch.


Und wenn ich die "int CTypes::anzahl=0;" ganz weg lass dann ist die statische Variable ja nicht zugeweisen [...]

Die Begriffe sind nicht ganz korrekt verwendet. Wenn du ein Konstrukt wie in den Anführungszeichen ganz weglässt, fehlt nicht nur eine Zuweisung. Vielmehr ist die ganze Variable dann nicht definiert, denn das was du innerhalb der Klassendefinition stehen hast (also innerhalb des "class { ... };"), dass ist nur eine Deklaration der statischen Variable.


auch das zuweisen der 0 gleich im struct ist nicht gestattet
Mal angenommen, das wäre erlaubt, dann würdest du bestimmt nicht "zuweisen" meinen, sondern "initialisieren".

Auf die Gefahr hin pädagogisch zu wirken: Ich würde auch nahelegen die "One Definition Rule" (häufig ODR abgekürzt) mal nachzuschlagen. Die hängt mit deinem Problem zusammen.

barton4
04-10-2006, 17:50
obwohl das Besipiel

struct foo
{
static int bar=0;
.....
}

hab ich in irendeinen turorial gesehen, weis aber leider nicht mehr genau in welchen.

locus vivendi
04-10-2006, 22:15
obwohl das Besipiel

struct foo
{
static int bar=0;
.....
}

hab ich in irendeinen turorial gesehen, weis aber leider nicht mehr genau in welchen.
Das wäre dann halt falsch. Oder in deiner Errinerung ist ein "const" abhanden gekommen:

struct foo
{
static int const bar = 0;
.....
}
Dies wäre in Ordnung.