 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Manuel Kiefer Guest
|
Posted: Sun Dec 28, 2003 9:23 pm Post subject: Statische Variablen und Klassen |
|
|
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
|
Posted: Mon Dec 29, 2003 10:06 am Post subject: Re: Statische Variablen und Klassen |
|
|
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
|
Posted: Mon Dec 29, 2003 11:13 am Post subject: Re: Statische Variablen und Klassen |
|
|
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
|
Posted: Mon Dec 29, 2003 8:31 pm Post subject: Re: Statische Variablen und Klassen |
|
|
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 |
|
 |
|
|
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
|
|