🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.lang.c++
5 messages
5 total messages Started by Nik Wiesel Sat, 02 Dec 1995 17:24
Probleme mit statischen Variablen in Methoden von Klassen.
#932
Author: Nik Wiesel
Date: Sat, 02 Dec 1995 17:24
90 lines
3590 bytes
Hallo,
ich habe hier ein problem mit der Handhabung statischer Variablen in Methoden 
von Klassen. Ich habe dazu mal nachfolgendes Beispielprogramm erstellt.
Die Klasse A enthaelt die Methode Test. In dieser Methode wird eine statische 
Integervariable definiert.
 Hier stellt sich fuer mich folgendes Problem: Wenn nun mehre Instanzen dieser 
Klasse erzeugt werden und die Methode der jeweiligen Instanz aufgerufen wird, 
dann nutzen alle Methoden dieser Klasse die selbe(!) Variable obwohl die 
statische definition lokal(!) innerhalb der Methode erfolgte und nicht 
innerhalb der Klasse. Wenn die statische Variable innerhalb der Klasse 
definiert würde, waere auch mir klar, dass alle Instanzen die selbe statische 
Variable nutzen wuerden.
 Wieso geschieht dies auch wenn die statische Variable lokal in einer Methode 
definiert wird?

Anstatt wie erwartet in den Klammern vier mal eine (1) auszugeben wird von 1 
bis 4 hochgezaehlt. Es wird also die selbe variable genutzt.

Antworten bitte auch an mich senden: 

uzs198@uni-bonn.de
Danke...


//*******************************************************
// C++ Beispiel: Mit BC++ 4.52
//*******************************************************

#include	<CONIO.H>
#include	<STDIO.H>

//*******************
// Klasse deklarieren
//*******************
class A {
public:				// Elemente oeffentlich machen
	A(void);		// Konstruktor deklarieren (immer Klassenname)
	~A(void);		// Destruktor deklarieren (immer ~Klassenname)
	void Test(void);	// Methode lokal für Datei deklarieren
				// static hat bei Funktionen anders als bei
				// Variablen nur die Beschraenkung des
				// Bezugsrahmens auf die Datei zur Folge.
	};

//********************
// Methoden definieren
//********************
A::A(void) {			// Konstruktor definieren
	printf("Konstruktor!");
	};

A::~A(void) {			// Destruktor definieren
	printf("Destruktor!");
	};

void A::Test(void) {		// Methode definieren
	static int W=0;		// Statische Variable
	printf("(%d)\n",++W);	// Wert ausgeben
	};

//**************
// Hauptprogramm
//**************
void main() {
//---------------------------------------------------------------------------
	clrscr();		// Bildschirm loeschen
//---------------------------------------------------------------------------
	A Klasse1,Klasse2;      // Zwei Instanzen der Klasse A erzeugen
	Klasse1.Test();		// Ohne Klammern = NOP
	Klasse2.Test();
//---------------------------------------------------------------------------
	{			// Neuen Bereich erzeugen
				// Zwei Instanzen der Klasse A erzeugen
		A Klasse1,Klasse2;
				// Mit dem gleichen Namen wie ausserhalb
				// des Bereichs!!!
		Klasse1.Test();
		Klasse2.Test();
		};		// Bereich beenden
//---------------------------------------------------------------------------
	getch();
	};


------------------------------
Nik Wiesel: UZS198@UNI-BONN.DE
=========================================================================
The above statement is my own opinion and does not represent the point of
view of any organization I am related to.
=========================================================================
Re: Probleme mit statischen Variablen in Methoden von Klassen.
#939
Author: Bernd Eggink
Date: Mon, 04 Dec 1995 12:51
35 lines
2051 bytes
Nik Wiesel (uzs198@uni-bonn.de) wrote:
>  Hallo,
>  ich habe hier ein problem mit der Handhabung statischer Variablen in Methoden 
>  von Klassen. Ich habe dazu mal nachfolgendes Beispielprogramm erstellt.
>  Die Klasse A enthaelt die Methode Test. In dieser Methode wird eine statische 
>  Integervariable definiert.
>   Hier stellt sich fuer mich folgendes Problem: Wenn nun mehre Instanzen dieser 
>  Klasse erzeugt werden und die Methode der jeweiligen Instanz aufgerufen wird, 
>  dann nutzen alle Methoden dieser Klasse die selbe(!) Variable obwohl die 
>  statische definition lokal(!) innerhalb der Methode erfolgte und nicht 
>  innerhalb der Klasse. Wenn die statische Variable innerhalb der Klasse 
>  definiert würde, waere auch mir klar, dass alle Instanzen die selbe statische 
>  Variable nutzen wuerden.
>   Wieso geschieht dies auch wenn die statische Variable lokal in einer Methode 
>  definiert wird?

>  Anstatt wie erwartet in den Klammern vier mal eine (1) auszugeben wird von 1 
>  bis 4 hochgezaehlt. Es wird also die selbe variable genutzt.

[ ... ]

Stell es Dir so vor: Methodenfunktionen sind Teil der Klasse, nicht des 
Objekts - es gibt immer nur 1 Exemplar davon (waere ja auch grauenhaft, 
wenn der Code einer Funktion so oft im Speicher stuende, wie es Objekte 
der Klasse gibt). Alles weitere ergibt sich daraus.

Gruss
	Bernd 

--
+----------------------------------+
|          Bernd Eggink            |
|    Rechenzentrum Uni Hamburg     |
| admin@rzaix13.rrz.uni-hamburg.de |
+----------------------------------+
Re: Probleme mit statischen Variablen in Methoden von Klassen.
#969
Author: Jens Ittel [ET]
Date: Thu, 07 Dec 1995 12:47
52 lines
2767 bytes
Nik Wiesel wrote:
> 
> Hallo,
> ich habe hier ein problem mit der Handhabung statischer Variablen in Methoden
> von Klassen. Ich habe dazu mal nachfolgendes Beispielprogramm erstellt.
> Die Klasse A enthaelt die Methode Test. In dieser Methode wird eine statische
> Integervariable definiert.
>  Hier stellt sich fuer mich folgendes Problem: Wenn nun mehre Instanzen dieser
> Klasse erzeugt werden und die Methode der jeweiligen Instanz aufgerufen wird,
> dann nutzen alle Methoden dieser Klasse die selbe(!) Variable obwohl die
> statische definition lokal(!) innerhalb der Methode erfolgte und nicht
> innerhalb der Klasse. Wenn die statische Variable innerhalb der Klasse
> definiert würde, waere auch mir klar, dass alle Instanzen die selbe statische
> Variable nutzen wuerden.
>  Wieso geschieht dies auch wenn die statische Variable lokal in einer Methode
> definiert wird?
> 
> Anstatt wie erwartet in den Klammern vier mal eine (1) auszugeben wird von 1
> bis 4 hochgezaehlt. Es wird also die selbe variable genutzt.
 
[ Beispiel gelosecht]

> Nik Wiesel: UZS198@UNI-BONN.DE


Hallo Nik,

Ich habe auf die schnelle zwar nichts im Stroustrup gefunden, aber ein
paar grundsaetzliche Gedanken helfen Dir vielleicht weiter.

- Was Du haben willst (je Methode und Exemplar eine individuelle
  Variable) ist nichts anderes als eine Exemplarvariable. Nur das Du sie
  an einer anderen Stelle definieren wolltest.

- Eine Methode mit Zustand ist eigentlich wieder ein eigenstaendiges
  Objekt.

- Die statischen Variablen in der Methode (wie von Dir beschrieben) sind
  damit Speicherbereiche die von allen Exemplaren einer Klasse geteilt
  werden und damit in den meisten Faellen wohl nicht sinnvoll zu 
  verwenden.

Ich vermute, dass das Verhalten eng mit der Realisierung von C++
zusammenhaengt. Der Code fuer eine Methode ist fuer alle Exemplare nur
einmal da. Deshalb gilt dies auch fuer den (static) Speicher. Als
Parameter bekommt die Methode die Adresse des Datenbereichs des
Exemplars.
Der eigentliche Grund duerfte aber ein historischer sein:
  statische Variablen in Funktionen funktionieren genauso ...

Tschau
	Jens
Re: Probleme mit statischen Variablen in Methoden von Klassen.
#975
Author: Hans-Ch. Eckert
Date: Thu, 07 Dec 1995 14:33
54 lines
2361 bytes
In <uzs198.233.00682EC7@uni-bonn.de>, uzs198@uni-bonn.de (Nik Wiesel) writes:
] Ich moechte lokale statische Variablen in einer Methode definieren. Diese 
] sollen aber bei den jeweiligen Instanzen der Klasse unabhaengig sein. Jede 
] Methode innerhalb der unterschiedlichen Instanzen soll also bei einem erneuten 
] Aufruf ihren Wert vom Vorigen Aufruf behalten. Dieser soll aber unabhaengig 
] von weiteren Instanzen der Klasse sein.

Es gibt zum einen Membervariablen.  Deren Werte sind statisch gegenueber
Methodenaufrufen und global innerhalb der Klasse, d.h. allen Methoden
bekannt.  Jede Instanz der Klasse hat ihre eigene Kopie der Membervariablen,
so dass sich die Werte zwischen verschiedenen Instanzen nicht beeinflussen.

// Beispiel
class foo
{
	int mFooMember;

public:
	foo() { mFooMember = 0; }
	int method( int i ) { return mFooMember += i; }
};

int main()
{
	foo f1;
	foo f2;
	int val1 = 0;
	int val2 = 0;

	val1 = f1.method(1);	// val1=1
	val2 = f2.method(2);	// val2=2
	val1 = f1.method(2);	// val1=3 (1+2)
	val2 = f2.method(3);	// val2=4 (2+2)
	val1 = f1.method(3);	// val1=6 (3+3)

	return val1+val2;	// Addition gegen Optimierung...
}


Zum anderen gibt es auch noch statische Variablen bezueglich einer
Klasse.  Diese enthalten dann Werte, die ueber alle Objekte hinweg
gleich sind.

int foo::classVar;


Gruss,
				Ripley

-- 
Hans-Ch. Eckert,   Regensburger Str.2,  10777 Berlin,   Germany * ISO 8859-1
(intl) ripley@nostromo.in-berlin.de,                            *  Ä Ö Ü
Alternative: ripley@cs.tu-berlin.de                             *  aeoeuess
NeXTmail: hansagia@w271zrz.zrz.tu-berlin.de (and nowhere else!) *  ä ö ü ß
Re: Probleme mit statischen Variablen in Methoden von Klassen.
#987
Author: Karl-Heinz Krause
Date: Sat, 09 Dec 1995 12:02
16 lines
1440 bytes
Am 5. Dez 1995 schrieb Nik Wiesel (uzs198@uni-bonn.de):

> Ich moechte lokale statische Variablen in einer Methode definieren. Diese 
> sollen aber bei den jeweiligen Instanzen der Klasse unabhaengig sein. Jede 
> Methode innerhalb der unterschiedlichen Instanzen soll also bei einem erneuten 
> Aufruf ihren Wert vom Vorigen Aufruf behalten. Dieser soll aber unabhaengig 
> von weiteren Instanzen der Klasse sein.
>  Deshalb versuchte ich dies ueber die lokale Definition der Variablen 
> innerhalb der jeweiligen Methode, was aber leider nicht funktionierte.

Nein, das funktioniert nicht, weil eben statische Variablen einer
Funktion (dazu zählen auch Methoden) nur einmal je Prozeß existieren und
nicht einmal je Instanz. Was Du benötigst sind ordinäre Membervariablen.


Karl-Heinz Krause
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads