 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ernst Baumann Guest
|
Posted: Tue Feb 15, 2005 12:48 pm Post subject: STATIC in C und in C++ |
|
|
Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
2)
Wie wird dies (bei einer sauberen Programmierung) in C++ (im
Zusammenhang mit Klassen gemacht) ?
Muss dort _extra_ ein Attribut (private Variable) in der Klasse
angelegt werden, wie in dem folgenden Beispiel, oder kann dies genauso
wie in C mit einer lokalen static Variablen gelöst werden ?
class Konto{
private:
char kname[100];
public:
void setname(char *n);
char *getname();
};
void Konto::setname(char *n){
strcpy(kname, n);
}
char *Konto::getname(){
return(kname);
}
void main(){
Konto k;
k.setname("Maier");
cout << k.getname() << endl;
}
3) Oder muss sogar extra eine Klassenvariable angelegt werden ?
Mit freundlichen Grüßen
Ernst
--
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 |
|
 |
Marcel Müller Guest
|
Posted: Tue Feb 15, 2005 2:14 pm Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann schrieb:
| Quote: | Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
2)
Wie wird dies (bei einer sauberen Programmierung) in C++ (im
Zusammenhang mit Klassen gemacht) ?
|
Man liefert eine Containerklasse zurück (Stichwort STL).
| Quote: | Muss dort _extra_ ein Attribut (private Variable) in der Klasse
angelegt werden, wie in dem folgenden Beispiel, oder kann dies genauso
wie in C mit einer lokalen static Variablen gelöst werden ?
|
Das hängt von der Natur der Problemstellung ab.
Wenn es eine dem Objekt zugeordnete Eigenschaft ist, macht man es schon
so ähnlich wie im Beispiel.
Wenn es jedoch ein einmaliger, errechneter Wert ist, wäre das wenig
zielführend. Dann ist eine Containerklasse fällig.
Static-Variablen, erteilen jeglicher Art machen die Funktionalität in
diesem Zusammenhann endgültig nicht thread-safe und nicht reentrant.
(Das gilt auch für C) Außerdem bleiben eventuell damit verbundene
Resourcen auf immer und ewig gebunden, auch wenn sie nur für einen
Augenblick gebraucht werden. (Genauer gesagt, bis die Applikation
terminiert.) Davon ist generell abzuraten.
| Quote: | class Konto{
private:
char kname[100];
public:
void setname(char *n);
char *getname();
^^^ |
const char* wäre angebrachter, andernfalls könnte ein Programm durch die
Hintertür den Inhalt von kname ändern:
k.getname()[3] = 'a';
| Quote: | };
void Konto::setname(char *n){
strcpy(kname, n);
^^^ |
Gefahr von Buffer-Overruns!
| Quote: | }
char *Konto::getname(){
return(kname);
}
void main(){
Konto k;
k.setname("Maier");
cout << k.getname() << endl;
}
|
In C++ würde man schreiben:
using namespace std;
class Konto{
private:
string kname;
public:
void setname(const string& n)
{ kname = n;
}
const string& getname() const
{ return kname;
}
};
void main(){
Konto k;
k.setname("Maier");
cout << k.getname() << endl;
}
Bei anderen Arrays könnte man schreiben
vector
{ ...
}
wenn z.B. eine Funktion ein Array von Integers zurückliefern soll.
| Quote: | 3) Oder muss sogar extra eine Klassenvariable angelegt werden ?
|
? - die Frage verstehe ich nicht.
Marcel
--
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 |
|
 |
Falk Tannhäuser Guest
|
Posted: Tue Feb 15, 2005 2:16 pm Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann wrote:
| Quote: | 1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
|
Mag oftmals gutgehen - bis man eines schönen Tages mal die
Funktion ein zweites Mal aufruft (am besten schön versteckt
in mehren Aufrufsebenen), bevor man mit der Auswertung des
Ergebnisses des ersten Aufrufs fertig war...
Dazu braucht man nicht mal mehrere Threads.
| Quote: | 2)
Wie wird dies (bei einer sauberen Programmierung) in C++ (im
Zusammenhang mit Klassen gemacht) ?
Muss dort _extra_ ein Attribut (private Variable) in der Klasse
angelegt werden, wie in dem folgenden Beispiel, oder kann dies genauso
wie in C mit einer lokalen static Variablen gelöst werden ?
|
Im konkret vorliegenden Fall am besten mit std::string arbeiten:
| Quote: | class Konto{
private:
std::string kname;
public:
void setname(std::string const& name) { kname = name; } |
std::string getname() const { return kname; }
Im allgemeinen Fall benutzt man in der Regel Standardcontainer
wie std::vector oder std::list. Wenn die Funktionsrückgabe per
Wert Performanzprobleme verursachen sollte, gibt z.B. es die
Möglichkeit, den Container über einen Referenzparameter zurück-
zugeben:
void rechne_ziemlich_viel_Zeuchs_aus(std::vector<int>& result)
{
long const nb_of_results = 1000000;
result.reserve(nb_of_results); // Optimierung - nicht zwingend erforderlich
for(long i=0; i<nb_of_results; ++i)
result.push_back(was_schoenes(i));
}
Eine weitere Möglichkeit wäre, einen Outputiterator zu übergeben:
template
void rechne_ziemlich_viel_Zeuchs_aus(OutputIterator oit)
{
for(long i=0; i<1000000; ++i)
*oit++ = was_schoenes(i);
}
Letzteres hat den Vorteil, dass der Aufrufer nicht gezwungen ist,
std::vector zu verwenden, wenn ihm ein anderer Container lieber ist:
std::list
rechne_ziemlich_viel_Zeuchs_aus(std::back_inserter(intlist));
Vielleicht will er ja die Ergebnisse auch gleich ausgeben, ohne
sie erst zwischenzuspeichern:
rechne_ziemlich_viel_Zeuchs_aus(std::ostream_iterator<int>(std::cout, ", "));
Es gibt also recht viele Möglichkeiten...
MfG
Falk
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Tue Feb 15, 2005 2:31 pm Post subject: Re: STATIC in C und in C++ |
|
|
"Ernst Baumann" <carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:csr311d6fmar4mu01ak7a6bbno1vaunv65 (AT) 4ax (DOT) com...
| Quote: | Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
|
Mach das nicht, das führt Dich schnell in Teufels Küche.
| Quote: |
2)
Wie wird dies (bei einer sauberen Programmierung) in C++ (im
Zusammenhang mit Klassen gemacht) ?
Muss dort _extra_ ein Attribut (private Variable) in der Klasse
angelegt werden, wie in dem folgenden Beispiel, oder kann dies genauso
wie in C mit einer lokalen static Variablen gelöst werden ?
class Konto{
private:
char kname[100];
public:
void setname(char *n);
char *getname();
};
void Konto::setname(char *n){
strcpy(kname, n);
}
char *Konto::getname(){
return(kname);
}
|
In C++ verwendet man für Zeichenketten std::string und kapselt das
ordentlich in einer Klasse:
class Konto
{
public:
Konto() : str_() {}
Konto(std::string const & str) : str_(str) {}
std::string const & getString() const {return str_};
void setString(std::string const & str) {str_ = str;}
private:
std::string str_:
};
| Quote: |
void main(){
Konto k;
k.setname("Maier");
cout << k.getname() << endl;
}
|
main gibt immer int zurück
| Quote: |
3) Oder muss sogar extra eine Klassenvariable angelegt werden ?
|
Verstehe nicht, was Du meinst. Du legst natürlich von der Klasse Konto eine
Instanz an.
Wenn die dann von einer Funktion zurückgegeben wird, wird sie per value
kopiert:
Konto erstelleKonto()
{
std::string name;
std::cin >> name;
return Konto(name);
}
Thomas
--
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 Kaul Guest
|
Posted: Tue Feb 15, 2005 2:32 pm Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann wrote:
2)
| Quote: | Wie wird dies (bei einer sauberen Programmierung) in C++ (im
Zusammenhang mit Klassen gemacht) ?
Muss dort _extra_ ein Attribut (private Variable) in der Klasse
angelegt werden, wie in dem folgenden Beispiel, oder kann dies genauso
wie in C mit einer lokalen static Variablen gelöst werden ?
Kommt wie immer darauf an, was du machen willst. Auch in C++ kannst du |
Methoden/Funktionslokal ne static Variable anlegen und zurückgeben.
Dein Beispiel zeigt aber, dass es in C++ andere Methoden gibt, um diese
etwas unschöne (Geschmacksache) Realisierung zu lösen.
Letztendlich braucht die Funktion intern halt Daten für verschiedene
Zwecke (z.B. große Strukturen sollen nicht als Rückgabewert kopiert
werden; dynamisch reservierter Speicher produziert Speicherleck wenn
aufrufende Funktion den Speicher nicht wieder freigibt; zwischen zwei
Funktionsaufrufe sollen die Daten zwischengespeichert werden...)
In C++ kann man die Daten von einer Klasse verwalten lassen - auf welche
Art hängt halt vom konkreten Fall ab.
In deinem Beispiel würde ich mit std::string statt char* arbeiten. Die
Stringklasse verwaltet intern selbst die Daten.
Wenn du innerhalb einer Funktion Speicher dynamisch reservierst und dich
nicht mehr um die Verwaltung/Freigabe kümmern willst (nachdem der
Pointer aus der Funktion rausgegeben wurde) dann bietet sich
std::auto_ptr an.
Wenn du zwischen zwei Funktionsaufrufe den Inhalt retten willst (z.B. um
den neuen Namen anzuhängen), dann bietet es sich an, kname als Attribut
der Klasse zu halten.
tschaule
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 |
|
 |
Tibor Pausz Guest
|
Posted: Tue Feb 15, 2005 6:27 pm Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann <carlox (AT) web (DOT) de> wrote:
| Quote: | Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
|
Abgesehen von dieser schwachsinnigen (sie ist nicht reentrant fähig)
Methode von C kann man in C++ andere Wege bestreiten.
1)
Man nimmt z.B. std::vector<T>
std::vector<T> foo ();
Das liefert Dir eine Array von Ts zurück, aber hier wird bei jeder
Rückgabe ein DeepCopy gemacht. Wenn Dir das aus Geschwindigkeitsgründen
mißfällt, dann kann man noch
2)
SmartPointer benutzen. Wie etwa www.boost.org shared_array
boost::shared_array<T> foo () {
return boost::shared_array<T> (new T[size]);
};
Es gibt SmartPointer mit DeepCopy und mit Shared. Such Dir den aus, den
Du brauchst.
--
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 |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Wed Feb 16, 2005 10:04 am Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann wrote:
Andere haben zwar schon geantwortet, welche Moeglichkeiten
es in C++ gibt, aber ...
| Quote: | Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
|
....
Hier liegt ein Denkfehler vor:
Man kann weder in C noch in C++ ein Array uebergeben. Weder als Input-
Parameter noch als Returnwert.
Alles was Du maximal machen kannst, ist die Adresse des Arrays zu uebergeben
(wieder: sowohl als Parameter als auch als Returnwert).
Daraus resultiert dann das bereits von anderen beschriebene Verhalten im
Falle von: Funktion haelt ein static Array und liefert 'dieses' zurueck.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Wed Feb 16, 2005 10:48 am Post subject: Re: STATIC in C und in C++ |
|
|
"Karl Heinz Buchegger" <kbuchegg (AT) gascad (DOT) at> schrieb im Newsbeitrag
news:42131AC7.C8453C95 (AT) gascad (DOT) at...
| Quote: | Ernst Baumann wrote:
Andere haben zwar schon geantwortet, welche Moeglichkeiten
es in C++ gibt, aber ...
Hallo allerseits,
1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
...
Hier liegt ein Denkfehler vor:
Man kann weder in C noch in C++ ein Array uebergeben. Weder als Input-
Parameter noch als Returnwert.
Alles was Du maximal machen kannst, ist die Adresse des Arrays zu
uebergeben
(wieder: sowohl als Parameter als auch als Returnwert).
|
Man kann arrays per-reference übergeben und zurückgeben. per-value geht
nicht; da findet die array->pointer Konvertierung statt.
Thomas
--
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 |
|
 |
Ernst Baumann Guest
|
Posted: Wed Feb 16, 2005 9:09 pm Post subject: Re: STATIC in C und in C++ |
|
|
| Quote: | ...
Hier liegt ein Denkfehler vor:
Man kann weder in C noch in C++ ein Array uebergeben. Weder als Input-
Parameter noch als Returnwert.
Alles was Du maximal machen kannst, ist die Adresse des Arrays zu uebergeben
(wieder: sowohl als Parameter als auch als Returnwert).
Es wird die Adresse (Returnwert) zurückgegeben. Da diese Adresse der |
Beginn des Speicherbereichs static-Variable (array) ist, ist dieser
Speicherbereich nach dem Funktionsaufruf noch vorhanden und nicht
zerstört.
Falls eine "normale", d.h. lokale nicht-static Variablen benutzt
worden wäre, wäre dieser Speicherbereich (Array) nach dem
Funktionsaufruf zerstört.
mfg
Ernst
--
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 |
|
 |
Ernst Baumann Guest
|
Posted: Wed Feb 16, 2005 9:09 pm Post subject: Re: STATIC in C und in C++ |
|
|
| Quote: | In C++ verwendet man für Zeichenketten std::string und kapselt das
ordentlich in einer Klasse:
class Konto
{
public:
Konto() : str_() {}
Konto(std::string const & str) : str_(str) {}
std::string const & getString() const {return str_};
void setString(std::string const & str) {str_ = str;}
private:
std::string str_:
};
Du verwendest also auch _extra_ ein Attribut (private Variable) in der |
Klasse. Das Attribut ist nur dazu da, den Wert zwischenzuspeichern.
| Quote: |
3) Oder muss sogar extra eine Klassenvariable angelegt werden ?
Verstehe nicht, was Du meinst. Du legst natürlich von der Klasse Konto eine
Instanz an.
Unter Klassenvariable verstehe ich ein Attribut in einer Klasse, das |
als static deklariert wird.
Zum Beispiel ist der Zinssatz (im Gegensatz zum Kontostand) für jedes
Konto der gleiche. Deswegen kann man diesen als Klassenvariable
anlegen. Man kann den Zinssatz dann abändern, indem man eben nicht den
Zinssatz eines _jeden schon_ angelegten Objekts abändert, sondern muss
nur einmal auf die Klassenvariable zugreifen.
Oder heisst dies in C++ nicht Klassenvariable?
Beispiel:
--------
private:
// Der Zinssatz soll für alle angelegte Konten gelten,
// deshalb wird er als Klassenvariable deklariert.
static double zinssatz;
....
--------
mfg
Ernst
--
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 |
|
 |
Ernst Baumann Guest
|
Posted: Wed Feb 16, 2005 9:09 pm Post subject: Re: STATIC in C und in C++ |
|
|
| Quote: |
Abgesehen von dieser schwachsinnigen (sie ist nicht reentrant fähig)
Methode von C kann man in C++ andere Wege bestreiten.
Einige alte MS-DOS Funktionen waren nicht reentrant fähig. |
Beispiel: (so weit ich mich noch richtig erinnere)
Es gibt eine (bestimmte, ich weiss nicht mehr welche) MS-DOS-Funktion
des Betriebssystems, in der die gleiche Funktion nochmals aufgerufen
wurde (z.B. durch einen Hardware-Interrupt des Timers verursacht).
Diese Funktion hat aber seinen Speicherbereich nicht auf dem Stack
reserviert. D.h. die Funktion f, die in der Funktion f aufgerufen
wurde, hat den Speicherbereich der Funktion f überschrieben, die
zuerst aufgerufen wurde. Wenn f den Stack benutzt hätte, wäre das
nicht passiert.
1) Wie heisst der andere Speicherbereich als der Stack?
Ist dies der Heap ?
2) Gibt es ausser Stack und Heap noch einen anderen Speicherberich ?
3) Welche Variablen legt der C++ Compiler wo (Stack, Heap, ...) ab?
4) Ist eine Funktion nicht reentrant fähig, wenn sie Speicher auf
einem anderen Speicherbereich als dem Stack ablegt?
5) die Attribute in einer Klasse sind doch auch so etwas wie globale
Variable, die vermutlich auf dem Heap abgelegt werden.
Ist dann eine Methode, die auf dieses Attribut zugreift nicht
reentrant fähig?
6) Ich kann mir gar nicht vorstellen (außer bei Threads), wo es in C
bzw. C++ (also einer Hochsprache) Probleme mit reentrant geben kann ?
Kannst du mir ein möglichst einfaches Beispiel dazu geben (ich dachte
die reentrant Problematik bekommt man nur, wenn man ganz "tief" ins
System eingreift (verbiegen des Timer-Interrupts und damit Aufruf im
Aufruf))
mfg
Ernst
--
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 |
|
 |
Ernst Baumann Guest
|
Posted: Wed Feb 16, 2005 9:09 pm Post subject: Re: STATIC in C und in C++ |
|
|
| Quote: | 1) um in C ein Array aus einer Funktion (Methode) mit return
zurückzugeben (d.h. nicht als Parameter) gibt es die Möglichkeit eine
lokale static Variable (Array) in der Methode anzulegen und diese mit
return zurückzugeben.
Mag oftmals gutgehen - bis man eines schönen Tages mal die
Funktion ein zweites Mal aufruft (am besten schön versteckt
in mehren Aufrufsebenen), bevor man mit der Auswertung des
Ergebnisses des ersten Aufrufs fertig war...
Dazu braucht man nicht mal mehrere Threads.
siehe mein Posting an Tibor. |
mfg
Ernst
--
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 |
|
 |
Thomas Mang Guest
|
Posted: Fri Feb 18, 2005 8:13 am Post subject: Re: STATIC in C und in C++ |
|
|
"Ernst Baumann" <carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:4kd711du61p5h9j4qlhcvqdreqab9q1ltv (AT) 4ax (DOT) com...
| Quote: | In C++ verwendet man für Zeichenketten std::string und kapselt das
ordentlich in einer Klasse:
class Konto
{
public:
Konto() : str_() {}
Konto(std::string const & str) : str_(str) {}
std::string const & getString() const {return str_};
void setString(std::string const & str) {str_ = str;}
private:
std::string str_:
};
Du verwendest also auch _extra_ ein Attribut (private Variable) in der
Klasse. Das Attribut ist nur dazu da, den Wert zwischenzuspeichern.
|
"Zwischenzuspeichern"? str_ ist Teil der Klasse Konto, und somit ein Teil
von jedem tatsächlichem Objekt Konto, das aus der Klassendefinition
generiert wurde. Ein Konto existiert ohne ein str_ nicht, das gehört dazu
wie ein main zu einem vollständigen Programm.
Deshalb würde ich aber sicher nicht UDT auf "zwischenspeichern" von
irgendwas reduzieren.
| Quote: |
3) Oder muss sogar extra eine Klassenvariable angelegt werden ?
Verstehe nicht, was Du meinst. Du legst natürlich von der Klasse Konto
eine
Instanz an.
Unter Klassenvariable verstehe ich ein Attribut in einer Klasse, das
als static deklariert wird.
Zum Beispiel ist der Zinssatz (im Gegensatz zum Kontostand) für jedes
Konto der gleiche. Deswegen kann man diesen als Klassenvariable
anlegen. Man kann den Zinssatz dann abändern, indem man eben nicht den
Zinssatz eines _jeden schon_ angelegten Objekts abändert, sondern muss
nur einmal auf die Klassenvariable zugreifen.
Oder heisst dies in C++ nicht Klassenvariable?
Beispiel:
--------
private:
// Der Zinssatz soll für alle angelegte Konten gelten,
// deshalb wird er als Klassenvariable deklariert.
static double zinssatz;
|
In C++ gibt es "data members" und "member functions", beides als "static"
und "non-static".
Hier kreierst Du ein "static data member", während mein str_ ein "non-static
data member" ist.
Du mußt halt wissen, welche data member einer Klasse pro Instanz (pro
Objekt) eigen sind - die sind dann non-static - und welche pro Klasse nur
einmal existieren, die sind dann static.
Beachte aber, daß verschiedene Konten verschiedene Zinssätze haben können.
Welches Problem genau möchtest Du lösen? Ich habe es ehrlich gesagt noch
nicht kapiert.
Thomas
--
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 |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Feb 18, 2005 9:37 am Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann wrote:
| Quote: |
Verstehe nicht, was Du meinst. Du legst natürlich von der Klasse Konto eine
Instanz an.
Unter Klassenvariable verstehe ich ein Attribut in einer Klasse, das
als static deklariert wird.
Zum Beispiel ist der Zinssatz (im Gegensatz zum Kontostand) für jedes
Konto der gleiche. Deswegen kann man diesen als Klassenvariable
anlegen. Man kann den Zinssatz dann abändern, indem man eben nicht den
Zinssatz eines _jeden schon_ angelegten Objekts abändert, sondern muss
nur einmal auf die Klassenvariable zugreifen.
|
Das wuerde ich aber nicht so machen.
Entweder der Zinssatz ist eben nicht fuer jedes Konto identisch
(und jeder der schon mal mit seiner Bank ueber den Zinssatz verhandelt
hat, weiss, dass es da durchaus Spielraum gibt), dann ist er ganz normales Member
der Klasse.
Oder aber der Zinssatz ist tatsaechlich fuer alle Konten gleich. Dann ist
der Zinssatz aber keine Eigenschaft eines Kontos an sich, sondern eine Eigenschaft
der Bank an sich. Ich wuerde ihn daher in eine Klasse 'Bank' verlagern (die
ich sowieso brauche, denn irgendwer muss ja die Konten verwalten).
Aber ich verstehe jetzt den Zusammenhang mit der urspruenglichen Frage nicht
ganz. Mir scheint allerdings, Du ueberschaetzt 'static' etwas. Der Einsatz von
'static' ist eher die Ausnahme als die Regel. Ich wuerde mal schaetzen, dass
statistisch gesehen mehr als 98% aller Member Variablen eben nicht 'static' sind,
sondern ganz normale plain vanilla Members.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
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 |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Fri Feb 18, 2005 9:59 am Post subject: Re: STATIC in C und in C++ |
|
|
Ernst Baumann wrote:
| Quote: |
Abgesehen von dieser schwachsinnigen (sie ist nicht reentrant fähig)
Methode von C kann man in C++ andere Wege bestreiten.
Einige alte MS-DOS Funktionen waren nicht reentrant fähig.
Beispiel: (so weit ich mich noch richtig erinnere)
Es gibt eine (bestimmte, ich weiss nicht mehr welche) MS-DOS-Funktion
des Betriebssystems, in der die gleiche Funktion nochmals aufgerufen
wurde (z.B. durch einen Hardware-Interrupt des Timers verursacht).
Diese Funktion hat aber seinen Speicherbereich nicht auf dem Stack
reserviert. D.h. die Funktion f, die in der Funktion f aufgerufen
wurde, hat den Speicherbereich der Funktion f überschrieben, die
zuerst aufgerufen wurde. Wenn f den Stack benutzt hätte, wäre das
nicht passiert.
|
Dafuer waeren allerdings potentiell andere Probleme aufgetaucht.
Zb. Stack overflow.
| Quote: |
1) Wie heisst der andere Speicherbereich als der Stack?
Ist dies der Heap ?
|
Nein. Mit einem Heap waere das Problem auch nicht aufgetreten. Jede
Instanz des Handlers haette ja dann seinen eigenen Speicher dynamisch
angefordert und wieder freigegeben.
Das ist ganz einfach Speicher, der irgendwo existiert. So wie das
Program an sich ja auch irgendwo im Speicher existiert.
| Quote: |
2) Gibt es ausser Stack und Heap noch einen anderen Speicherberich ?
|
Nun, das eigentliche Program muss irgendwo liegen. Globale Variablen
liegen irgendwo im Speicher. Da Du als C++ Programmierer darauf aber
nur beschraenkten Einfluss hast, haben diese Speicher ueblicherweise
keinen Namen (zumindest nicht in ueblicher C++ Nomenklatur).
| Quote: |
3) Welche Variablen legt der C++ Compiler wo (Stack, Heap, ...) ab?
|
globale Variablen landen irgendwo im Speicher.
lokale Variablen werden normalerweise am Stack abgelegt
und den Heap benutzt Du ueber dynamische Speicherallokierungen
(malloc/free, new/delete)
| Quote: |
4) Ist eine Funktion nicht reentrant fähig, wenn sie Speicher auf
einem anderen Speicherbereich als dem Stack ablegt?
|
Kommt auf die Funktion an. Am einfachsten ist es immer Reentrance
ueber lokale Variablen zu erreichen. Muss aber nicht so sein. Als
Programmierer kann ich mir auch andere Dinge ueberlegen, um das ganze
Reentrant-faehig zu machen. Da gibt es mehrere Moeglichkeiten, je
nachdem welche Anforderungen ich habe.
| Quote: |
5) die Attribute in einer Klasse sind doch auch so etwas wie globale
Variable,
|
Ah, nein. Selbst bei grosszuegiger Auslegung dieses Satzes kann ich dem
nicht zustimmen.
Die 'Attribute' einer Klasse sind einfach eine Feinstruktur einer Variablen,
die ansonsten eine ganz normale Variable ist. Nurist diese Variable halt
kein int oder char oder double, sondern sie wird intern noch etwas unterteilt.
Das ist alles.
| Quote: | die vermutlich auf dem Heap abgelegt werden.
|
Kann sein, kann auch nicht sein. Haengt gaenzlich davon ab, wie ich das
Objekt erzeuge.
| Quote: | Ist dann eine Methode, die auf dieses Attribut zugreift nicht
reentrant fähig?
|
Quatsch. Jedes Objekt dieser Klasse hat seinen eigenen Satz von Member
Variablen. Eine Funktion arbeitet auf diesem Variablensatz, der klarer-
weise fuer verschiedene Objekte auch verschieden ist. Das Ganze hat
nichts mit reentrance zu tun.
| Quote: |
6) Ich kann mir gar nicht vorstellen (außer bei Threads), wo es in C
bzw. C++ (also einer Hochsprache) Probleme mit reentrant geben kann ?
Kannst du mir ein möglichst einfaches Beispiel dazu geben (ich dachte
die reentrant Problematik bekommt man nur, wenn man ganz "tief" ins
System eingreift (verbiegen des Timer-Interrupts und damit Aufruf im
Aufruf))
|
Dieses 'Aufruf im Aufruf' Schema, gekoppelt mit globalen oder static Variablen
ist genau der Kern des Reentrance Problems. Der Rest drumherum ist nur Beiwerk
das einmal kompliziert oder manchmal auch ganz einfach ausfallen kann. Es spielt
keine Rolle ob der Aufruf dabei ueber einen Timer oder aus dem Pgm heraus ueber
einen normalen Funktionsaufruf gemacht wird.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
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
|
|