C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Statische Variablen und Klassen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Manuel Kiefer
Guest





PostPosted: Sun Dec 28, 2003 9:23 pm    Post subject: Statische Variablen und Klassen Reply with quote



Hallo,
ich habe folgendes Problem:
Da ich eine globale Variable brauche (auch über das gesamte Projekt,
sprich alle *.CPP und *.h Dateien) habe ich in einer Klasse eine statische
Variable definert:

//Save.h
class CSave
{
public:
CSave();
virtual ~CSave();
static int dedicated;
}

Wenn ich jetzt auf die Variable von Site1.cpp zugreifen will muß ich sie
erst als global definieren:

int CSave::dedicated;

und dann weiter unten in einer Funktion:

CSave::dedicated=2;

Wiso das? Kann mann das nicht mit
CSave Save; und dann in der Funktion Save.dedicated=2; machen? Da kommt
bei mir ein Fehler.

Außerdem muß ich bei Site2.cpp auch noch auf diese Variable zugreifen.
Wenn ich hier wieder ein: int CSave::dedicated; mache kommt das:

Site2.obj : error LNK2005: "public: static int CSave::dedicated"
(?dedicated@CSave@@2HA) bereits in Site1.obj definiert

Geht das eleganter?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Marco Budde
Guest





PostPosted: Mon Dec 29, 2003 10:06 am    Post subject: Re: Statische Variablen und Klassen Reply with quote



Manuel Kiefer wrote:

Quote:
Da ich eine globale Variable brauche (auch über das gesamte Projekt,
sprich alle *.CPP und *.h Dateien)

Sicher? Warum?

Quote:
Wenn ich jetzt auf die Variable von Site1.cpp zugreifen will muß ich sie
erst als global definieren:

Nein, global ist sie nicht wirklich. Normalerweise würdest Du sie in
der Implementierungsdatei von CSave anlegen. Und nur dort.


int CSave::dedicated = 0;

Quote:
Außerdem muß ich bei Site2.cpp auch noch auf diese Variable zugreifen.
Wenn ich hier wieder ein: int CSave::dedicated; mache kommt das:

Site2.obj : error LNK2005: "public: static int CSave::dedicated"
(?dedicated@CSave@@2HA) bereits in Site1.obj definiert

Richtig, der Speicher und das Symbol für die Variable existieren ja
bereits. Du brauchst nur "Save.h" includen.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Mon Dec 29, 2003 11:13 am    Post subject: Re: Statische Variablen und Klassen Reply with quote



On Sun, 28 Dec 2003 22:23:06 +0100, Manuel Kiefer
<manuel_kiefer (AT) gmx (DOT) de> wrote:

Quote:
Hallo,
ich habe folgendes Problem:
Da ich eine globale Variable brauche (auch über das gesamte Projekt,
sprich alle *.CPP und *.h Dateien) habe ich in einer Klasse eine statische
Variable definert:

//Save.h
class CSave
{
public:
CSave();
virtual ~CSave();
static int dedicated;
}

Wenn ich jetzt auf die Variable von Site1.cpp zugreifen will muß ich sie
erst als global definieren:

int CSave::dedicated;


Quote:
und dann weiter unten in einer Funktion:

CSave::dedicated=2;


Quote:
Wiso das? Kann mann das nicht mit
CSave Save; und dann in der Funktion Save.dedicated=2; machen? Da kommt
bei mir ein Fehler.

Richtig. Statische Klassenelemente und Instanzen von Klassen haben
nichts miteinander zu tun. Sie befinden sich "ausserhalb" aller
Instanzen der Klasse und existieren - wenn sie definiert sind - auch
dann, wenn es ueberhaupt keine Instanzen dieser Klasse gibt. Sie
muessen unabhaengig von irgendwelchen Instanzen der Klasse irgendwo
*definiert* werden. Das Hinschreiben von

static int dedicated;

innerhalb der Klassendefinition deklariert nur ein solches Element -
d.h. dadurch wird ihre Existenz bekannt gemacht. Weder dadurch noch
durch Konstruktion einer Instanz der Klasse CSave wird das Element
CSave::dedicated leibhaftig *definiert*. Dazu nuss es z.B. in der
Implementierungsdatei csave.cpp - und *nur* dort - einmal per

// file csave.cpp
#include "csave.h"
int CSave::dedicated = 2;

definiert werden (und kann dort moeglicherweise gleich initialisiert
werden). Damit ist es in *allen* Dateien des Projekts, die csave.h
includieren, automatisch zugaenglich, ohne dass irgendeine Instanz von
CSave konstruiert werden muss. Ein statisches Element ist schlicht
eine "normale Variable", die nur ueber den Namensraum der Klasse
zugaenglich ist, und sie muss im Wesentlichen wie eine normale
Variable behandelt werden. Dies bedeutet also insbesondere, dass sie
genau *einmal* im Projekt *definiert* werden muss.

MfG
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Winkler
Guest





PostPosted: Mon Dec 29, 2003 8:31 pm    Post subject: Re: Statische Variablen und Klassen Reply with quote

Manuel Kiefer wrote:
Quote:
Hallo,
ich habe folgendes Problem:
Da ich eine globale Variable brauche (auch über das gesamte Projekt,
sprich alle *.CPP und *.h Dateien) habe ich in einer Klasse eine statische
Variable definert:

//Save.h
class CSave
{
public:
CSave();
virtual ~CSave();
static int dedicated;
}

Wenn ich jetzt auf die Variable von Site1.cpp zugreifen will muß ich sie
erst als global definieren:

int CSave::dedicated;

und dann weiter unten in einer Funktion:

CSave::dedicated=2;

Wiso das? Kann mann das nicht mit
CSave Save; und dann in der Funktion Save.dedicated=2; machen? Da kommt
bei mir ein Fehler.

Außerdem muß ich bei Site2.cpp auch noch auf diese Variable zugreifen.
Wenn ich hier wieder ein: int CSave::dedicated; mache kommt das:

Site2.obj : error LNK2005: "public: static int CSave::dedicated"
(?dedicated@CSave@@2HA) bereits in Site1.obj definiert

Geht das eleganter?

Ja und nein: Statische Member müssen genau an einer Stelle im Code
instanziiert werden. Das kann (und sollte) dann aber durchaus mit einer
Initialisierung verbunden werden.

Außerdem macht es in Deinem Beispiel Sinn, das Ding nicht in Site2.cpp
anzulegen, sondern in Save.cpp, denn es gehört doch zu der Klasse CSave.

Also:
Save.h wie gehabt von Dir.

in Save.cpp:

int CSave::dedicated = 2;

und in anderen Übersetzungseinheiten, in denen du das brauchst, _nicht_
die von dir beschriebene erneute Deklaration, die in der Tat dann eine
unzulässige Mehrfachdefinition wäre.

In Site2.cpp reicht also dann:

#include "Save.h"

machwas_mit( CSave::dedicated );


Gruß
Martin

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.