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 

Aufruf von statischen Funktionen
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Thomas Thiele
Guest





PostPosted: Tue Apr 24, 2007 5:55 pm    Post subject: Aufruf von statischen Funktionen Reply with quote



Hallo zusammen,

warum bringt eigentlich so jede IDE, ob C++ oder Java eine Warning
wenn man eine statische Methode an einer Instanz aufruft?

class A{
public:
static void method1();
void method2();
};

A a;
a.method2(); //ist ok
a.method1(); //bringt warning
A::method1(); //ist wieder ok

Was mich interessiert ist die Philosophie, die hinter dieser Warning
steckt.
Denn für mein Verständnis ist die Tatsache ob method1() statisch ist
oder nicht in diesem nichtstatischen Aufrufkontext ein reines
Implementationsdetail. Analog zu const, da ist ja (bei nichtkonstanten
Instanzen) auch egal, ob die Methode const ist oder nicht. Oder
übersehe ich hier was?
Back to top
Jan Gosmann
Guest





PostPosted: Wed Apr 25, 2007 9:11 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Thomas Thiele schrieb:
Quote:
a.method1(); //bringt warning

Das erweckt den Eindruck, dass die Funktion method1() nur die Variablen
der Instanz a der Klasse A verändert/verändern kann. Tatsächlich kann es
aber dazu kommen, dass statische Variablen, die alle Instanzen der
Klasse verwenden, verändert werden.

Quote:
A::method1(); //ist wieder ok

Bei dieser Variante sieht man gleich, kann sich evtl. Änderungen von
(statischen) Variablen der Klasse auf alle Instanzen bezieht.

Ein entsprechende Warnung sehe ich durchaus als sinnvoll an. So wird
verhindert, dass man eine Funktion verwendet, die sich auf alle
Instanzen auswirken kann, obwohl man eigentlich nur eine Instanz
beeinflussen will.

MfG, Jan Gosmann

- --
E-Mail: blubb@hyper-world.de
Homepage: www.hyper-world.de
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGLxQpffrSAKqtmpcRAjalAJ4wWoAw3zzgbniSgtUO1mNpbKzwsQCcDokv
pO9ePszNbibedzVSBF7THhg=
=w0Hh
-----END PGP SIGNATURE-----
Back to top
Daniel Albuschat
Guest





PostPosted: Wed Apr 25, 2007 9:11 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote



Thomas Thiele wrote:
Quote:
Hallo zusammen,

warum bringt eigentlich so jede IDE, ob C++ oder Java eine Warning
wenn man eine statische Methode an einer Instanz aufruft?

Weder C++ noch Java sind "IDE"s. Es sind Programmiersprachen.
Und es gibt noch mehr Programmiersprachen als C++ und Java, auch
wenn dir das an der Uni verschwiegen wird.
Die Warnung bringt auch nicht die IDE sondern der Compiler.

Quote:
class A{
public:
static void method1();
void method2();
};

A a;
a.method2(); //ist ok
a.method1(); //bringt warning
A::method1(); //ist wieder ok

Nein, da macht mein GCC keine Warnung.
Mit -ansi -pedantic -W -Wall getestet.

Quote:
Was mich interessiert ist die Philosophie, die hinter dieser Warning
steckt.

Höchstens, dass die Aufrufsyntax mit einer nicht-statischen Methode
verwechselt werden kann. Bei A::method1(); sieht der Leser, dass
method1() statisch ist.

Quote:
Denn für mein Verständnis ist die Tatsache ob method1() statisch ist
oder nicht in diesem nichtstatischen Aufrufkontext ein reines
Implementationsdetail.

Jedoch nicht für einen Leser des Codes, der ihn auch verstehen will.
Z.B. ist es für ihn wichtig, dass a ruhig uninitialisiert sein kann,
wenn method1() aufgerufen wird, weil method1() sowieso nicht den
Kontext von a hat.

MfG,
Daniel
Back to top
Daniel Albuschat
Guest





PostPosted: Wed Apr 25, 2007 2:21 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Jan Gosmann wrote:
Quote:
Thomas Thiele schrieb:
a.method1(); //bringt warning

Das erweckt den Eindruck, dass die Funktion method1() nur die Variablen
der Instanz a der Klasse A verändert/verändern kann. Tatsächlich kann es
aber dazu kommen, dass statische Variablen, die alle Instanzen der
Klasse verwenden, verändert werden.

Dein Argument zieht nicht.
Auch eine method1(), die nicht-statisch ist, kann statische Member
der Klasse verändern.

Es können ja auch nicht nur statische Methoden statische
Methoden aufrufen. Wo kämen wir denn da hin? :-)

MfG,
Daniel
Back to top
Olaf Krzikalla
Guest





PostPosted: Wed Apr 25, 2007 2:59 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Hi,

Jan Gosmann wrote:
Quote:
a.method1(); //bringt warning

Das erweckt den Eindruck, dass die Funktion method1() nur die Variablen
der Instanz a der Klasse A verändert/verändern kann. Tatsächlich kann es
aber dazu kommen, dass statische Variablen, die alle Instanzen der
Klasse verwenden, verändert werden.
Es ist egal, ob method1 statisch oder nicht statisch ist. Statische

Variablen können auch von nicht-statischen Methoden geändert werden.
Insofern bringt die Warnung also nichts.
Und auch sonst fällt mir nicht ein, warum ich eine solche Warnung haben
wöllte. Im Gegenteil, gerade mit Templates und Traits würde mich diese
Warnung sehr stören. Zum Glück habe ich noch auf keinem mir bekannten
C++-Compiler eine solche Warnung gesehen. Würd mich mal interessieren,
mit welchem Compiler der OP arbeitet.

MfG
Olaf Krzikalla
Back to top
Thomas Thiele
Guest





PostPosted: Wed Apr 25, 2007 6:56 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Olaf Krzikalla <krzikalla (AT) gmx (DOT) de> wrote:


Quote:
Würd mich mal interessieren,
mit welchem Compiler der OP arbeitet.

Derzeit Visual C++ 2005.
Aber unter Java, mit Eclipse, kommt die selbe Warning.
Ich habe es jetzt nicht mit gcc probiert. Mache ich morgen.
Aber unter Visual C++ 6.0 war's glaub ich auch.

Ich dachte halt es sei ein bestimmter guter Stil es so zu tun, und der
leuchtete mir - wie dir - eben nicht ein.

Gruß Thomas
Back to top
Thomas Thiele
Guest





PostPosted: Wed Apr 25, 2007 7:05 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Daniel Albuschat <daniel (AT) happy (DOT) viming.de> wrote:

Quote:
warum bringt eigentlich so jede IDE, ob C++ oder Java eine Warning
wenn man eine statische Methode an einer Instanz aufruft?

Weder C++ noch Java sind "IDE"s. Es sind Programmiersprachen.

Oochh bitte, sind wir hier im Kindergarten?

Quote:
Und es gibt noch mehr Programmiersprachen als C++ und Java, auch
wenn dir das an der Uni verschwiegen wird.

An der Uni hatte ich btw. Pascal.
Heute auf Pöpelkurs, odr was?

Quote:
Die Warnung bringt auch nicht die IDE sondern der Compiler.

In Java ist es eindeutig Eclipse, also die IDE(!), welche die Warning
entsprechend farbig anmerkt. Ob der Java-Compiler das auch als Warning
bring wüsste ich jetzt gar nicht. Und abgesehen davon, ist das für die
Fragestellung völlig irrelavant!

Quote:
Höchstens, dass die Aufrufsyntax mit einer nicht-statischen Methode
verwechselt werden kann. Bei A::method1(); sieht der Leser, dass
method1() statisch ist.

Nö. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Quote:
Jedoch nicht für einen Leser des Codes, der ihn auch verstehen will.
Z.B. ist es für ihn wichtig, dass a ruhig uninitialisiert sein kann,
wenn method1() aufgerufen wird, weil method1() sowieso nicht den
Kontext von a hat.

Wenn solche Gefahren bestehen, sollte der Programmierer von A,
entsprechende Exceptions werfen oder Fehlercodes liefern, oder Errorlogs
schreiben.
Back to top
Rolf Magnus
Guest





PostPosted: Sun Apr 29, 2007 4:25 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Thomas Thiele wrote:

Quote:
Daniel Albuschat <daniel (AT) happy (DOT) viming.de> wrote:

warum bringt eigentlich so jede IDE, ob C++ oder Java eine Warning
wenn man eine statische Methode an einer Instanz aufruft?

Weder C++ noch Java sind "IDE"s. Es sind Programmiersprachen.

Oochh bitte, sind wir hier im Kindergarten?

Nein. Wir sind in einer Diskussionsrunde zur Sprache C++ nach ISO-Norm. Auch
wenn du Genauigkeit bei der Begriffsverwendung für Kinderkram hältst, ist
sie hier Voraussetzung.

Quote:
Und es gibt noch mehr Programmiersprachen als C++ und Java, auch
wenn dir das an der Uni verschwiegen wird.

An der Uni hatte ich btw. Pascal.
Heute auf Pöpelkurs, odr was?

Naja, "jede, egal ob C++ oder Java" klingt irgendwie, als hättest du noch
nie von was anderem gehört. Abgesehen davon: Wieviele IDEs hast du
eigentlich ausprobiert, daß du so genau weißt, wie sich alle verhalten?

Quote:
Die Warnung bringt auch nicht die IDE sondern der Compiler.

In Java ist es eindeutig Eclipse, also die IDE(!), welche die Warning
entsprechend farbig anmerkt. Ob der Java-Compiler das auch als Warning
bring wüsste ich jetzt gar nicht. Und abgesehen davon, ist das für die
Fragestellung völlig irrelavant!

Ob die IDE eine Warnung bringt, ist hier irrelevant. Was bei Java passiert,
auch.

Quote:
Höchstens, dass die Aufrufsyntax mit einer nicht-statischen Methode
verwechselt werden kann. Bei A::method1(); sieht der Leser, dass
method1() statisch ist.

Nö. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Das macht aber nicht viel Unterschied. Beide werden einfach so aufgerufen,
ohne Objekt, so wie eine einfache globale Funktion. Bei einer
nicht-statischen Memberfunktion ist das anders.

Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?
Back to top
Stefan Reuther
Guest





PostPosted: Sun Apr 29, 2007 2:38 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Rolf Magnus wrote:
Quote:
Thomas Thiele wrote:
Die Warnung bringt auch nicht die IDE sondern der Compiler.

In Java ist es eindeutig Eclipse, also die IDE(!), welche die Warning
entsprechend farbig anmerkt. Ob der Java-Compiler das auch als Warning
bring w?sste ich jetzt gar nicht. Und abgesehen davon, ist das f?r die
Fragestellung v?llig irrelavant!

Ob die IDE eine Warnung bringt, ist hier irrelevant. Was bei Java passiert,
auch.

Nun, Erkundungen nach möglichen Gründen für eine Warnung kann man schon
hier anstellen. Nur findet man bei so obskuren Warnungen wie der
hiesigen die Begründung wohl bestenfalls im Compilerhandbuch, weil wir
uns ja einig zu sein scheinen, dass die Warnung unsinnig ist :)

[A::foo()]
Quote:
N?. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Oder um eine Memberfunktion Klasse 'A', falls der Aufruf in einer
Memberfunktion einer Kindklasse von 'A' stattfindet.

Quote:
Das macht aber nicht viel Unterschied. Beide werden einfach so aufgerufen,
ohne Objekt, so wie eine einfache globale Funktion. Bei einer
nicht-statischen Memberfunktion ist das anders.

Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?

Das kann z.B. nützlich sein bei sowas
template<typename T, typename Comp>
void blubbersort(T zeug[], size_t count, const Comp& c) {
size_t i = 1;
while (i < count) {
if (c.isGreater(zeug[i-1], zeug[i])) {
c.swap(zeug[i-1], zeug[i]);
if (i > 1) --i;
} else {
++i;
}
}
}
Im häufigen Fall, dass das Zugriffsobjekt 'c' keine Statusinformationen
benötigt, macht man die Funktionen statisch und das Objekt kann komplett
wegoptimiert werden. Mich wundert eigentlich, dass der operator() nicht
ebenfalls statisch sein darf.


Stefan
Back to top
Thomas Thiele
Guest





PostPosted: Sun Apr 29, 2007 8:50 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

On 29 Apr., 01:25, Rolf Magnus <ramag...@t-online.de> wrote:

Hallo Rolf!

Quote:
Oochh bitte, sind wir hier im Kindergarten?
Nein. Wir sind in einer Diskussionsrunde zur Sprache C++ nach ISO-Norm. Auch
wenn du Genauigkeit bei der Begriffsverwendung für Kinderkram hältst, ist
sie hier Voraussetzung.

Doch. Das was du hier wieder betreibst _ist_ Kindergarten!

Du hast recht, dass dies eine rein C++-Gruppe ist.
Aber meine Frage ist nun mal keine reine C++-Frage!
Soll ich die Frage deiner Meinung nach nochmal mit leicht anderer
Formulierung in einer Java-Gruppe und meinetwegen Delphi-Gruppe oder
C#-Gruppe stellen?

Du kannst mir vorwerfen, eine sprachübergreifende Frage in einer
reinen C++-Gruppe zu stellen, aber den Rest nicht.
Für die Frage an sich ist der Streib on Compiler oder IDE oder welcher
Compiler oder welche Idee die Warning bringt völlig egal. Es ist sogar
egal, was Java macht. Nicht ganz, denn Java orientiert sich zum
Großteil ob positiv oder negativ nunmal an C++.
Entscheident ist, dass die Frage auch bei C++ auftritt und ist damit
obwohl sprachübergreifend eben doch on-topic.
Zumal auch du nicht auf die eigentliche Frage eingehst!

Quote:
Naja, "jede, egal ob C++ oder Java" klingt irgendwie, als hättest du noch
nie von was anderem gehört. Abgesehen davon: Wieviele IDEs hast du
eigentlich ausprobiert, daß du so genau weißt, wie sich alle verhalten?

Das spielt für die Frage keine Rolle, denn mindestens ein C++-Compiler
bringt diese Warning.

Quote:
N?. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Das macht aber nicht viel Unterschied.

Ach? Das mag für den Compiler keinen großen Unterschied machen. Aber
ansonsten ist es ein großer zumindest theoretischer Unterschied.
Und bevor zu was erwiderst, mir sind die "Innereien" bekannt und es
ist nunmal ein großer Unterscheid ob es eine globale Funktion ist oder
eine statische Methode.
Wenn du oben pingelig bist dann gefälligst auch hier!

Quote:
Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?

Wenn ich z.B. sowieso ein Objekt habe, und ich nacheinander mehre
Funktionen aufrufe, die ähnliches machen, dann sieht es einfach
schöner aus, wenn die Aufrufe immer gleich sind.

MyClass c;
c.methode1();
c.methode2();
c.methode3();

anstatt:

c.methode1();
MyClass::methode2();
c.methode3();

Und wenn ich jetzt aus irgendeinen Grund methode3() auch noch statisch
mache, weil ich es a) kann und b) sie irgendwo brauche wo ich kein
Objekt habe, dann müsste ich oberen Quellcode ändern. Ok, ich muss
nicht, aber ich bekomme eine sinnlose Warning.

Gruß Thomas

P.S. wenn ich unsauber formulier habe, dann hat das entweder einen
Grund (in dem Fall, dass ich Java nicht ausschliessen wollte) oder ich
nehme Berichtigungen dazu gerne zur Kenntniss. Aber auch noch
Rechtfertigungen dazu, tue ich mir nicht an.
Für einen solchen Teilthread dann EOD. Für die eigentliche Frage,
warum statische Funktion nicht an einer Instanz aufrufen können wir
gernen diskutieren.
P.P.S. Diskussionen ala "welche IDE/Compiler/Sprache kennst und kannst
du eigentlich, Kleiner" auch EOD!
Back to top
Rolf Magnus
Guest





PostPosted: Mon Apr 30, 2007 1:42 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Stefan Reuther wrote:

Quote:
Rolf Magnus wrote:
Thomas Thiele wrote:
Die Warnung bringt auch nicht die IDE sondern der Compiler.

In Java ist es eindeutig Eclipse, also die IDE(!), welche die Warning
entsprechend farbig anmerkt. Ob der Java-Compiler das auch als Warning
bring w?sste ich jetzt gar nicht. Und abgesehen davon, ist das f?r die
Fragestellung v?llig irrelavant!

Ob die IDE eine Warnung bringt, ist hier irrelevant. Was bei Java
passiert, auch.

Nun, Erkundungen nach möglichen Gründen für eine Warnung kann man schon
hier anstellen. Nur findet man bei so obskuren Warnungen wie der
hiesigen die Begründung wohl bestenfalls im Compilerhandbuch, weil wir
uns ja einig zu sein scheinen, dass die Warnung unsinnig ist :)

[A::foo()]
N?. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Oder um eine Memberfunktion Klasse 'A', falls der Aufruf in einer
Memberfunktion einer Kindklasse von 'A' stattfindet.

Das macht aber nicht viel Unterschied. Beide werden einfach so
aufgerufen, ohne Objekt, so wie eine einfache globale Funktion. Bei einer
nicht-statischen Memberfunktion ist das anders.

Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?

Das kann z.B. nützlich sein bei sowas
template<typename T, typename Comp
void blubbersort(T zeug[], size_t count, const Comp& c) {
size_t i = 1;
while (i < count) {
if (c.isGreater(zeug[i-1], zeug[i])) {
c.swap(zeug[i-1], zeug[i]);
if (i > 1) --i;
} else {
++i;
}
}
}
Im häufigen Fall, dass das Zugriffsobjekt 'c' keine Statusinformationen
benötigt, macht man die Funktionen statisch und das Objekt kann komplett
wegoptimiert werden.

Das geht aber mit einer nicht-statischen Funktion auch, zumindest wenn man
Comp nicht per Referenz übergibt.

Quote:
Mich wundert eigentlich, dass der operator() nicht ebenfalls statisch sein
darf.

"static" heißt hier eben "für die Klasse" statt "für das Objekt". Ich würde
erwarten, daß ein statischer operator() in der Art "Klasse()" aufgerufen
würde. Das ist aber schon die Syntax für die Erzeugung einer Instanz.
Back to top
Rolf Magnus
Guest





PostPosted: Mon Apr 30, 2007 9:11 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Thomas Thiele wrote:

Quote:
Soll ich die Frage deiner Meinung nach nochmal mit leicht anderer
Formulierung in einer Java-Gruppe und meinetwegen Delphi-Gruppe oder
C#-Gruppe stellen?

Wenn du wissen willst, warum sich Java, Delphi und C# so verhalten, wie sie
es tun, ja. Usenet ist eben themenbasiert.

Quote:
Es ist sogar egal, was Java macht. Nicht ganz, denn Java orientiert sich
zum Großteil ob positiv oder negativ nunmal an C++.
Entscheident ist, dass die Frage auch bei C++ auftritt und ist damit
obwohl sprachübergreifend eben doch on-topic.

Streng genommen ist die Frage off-topic, da nur die Sprache selbst
diskutiert wird, und keine speziellen Tools, egal ob Compiler oder IDE.
Theoretisch sollten die Fragen nur mit Informationen aus der C++-Norm
beantwortet werden können. Ganz so eng sehe ich es dann aber nicht, und die
Moderation wohl auch nicht, sonst wäre dein Posting gar nicht erst
durchgekommen.

Quote:
Zumal auch du nicht auf die eigentliche Frage eingehst!

Ich mag es eben nicht besonders, wenn jemand hier reinkommt und die Gruppe
erstmal als Kindergarten bezeichnet, nur weil ihm die Antwort nicht
gefällt. Sowas lasse ich ungern einfach so stehen, auch wenn ich es
vielleicht sollte.

Quote:
Naja, "jede, egal ob C++ oder Java" klingt irgendwie, als hättest du noch
nie von was anderem gehört. Abgesehen davon: Wieviele IDEs hast du
eigentlich ausprobiert, daß du so genau weißt, wie sich alle verhalten?

Das spielt für die Frage keine Rolle, denn mindestens ein C++-Compiler
bringt diese Warning.

Du hast behauptet, jede IDE (oder Compiler oder was auch immer) würde die
Warnung bringen, also muß es doch zumindest eine recht große Anzahl sein
und nicht nur eine oder zwei. Das ist sonst etwa so wie mit den 82,7% aller
Statistiken, die spontan erfunden werden, um den eigenen Standpunkt zu
untermauern und wirkt wenig professionell.

Ich habe es übrigens mit gcc ausprobiert, und er hat nicht gewarnt.

Quote:
N?. Es kann sich auch um eine Standalone-Funktion aus dem Namespace A
handeln.

Das macht aber nicht viel Unterschied.

Ach? Das mag für den Compiler keinen großen Unterschied machen. Aber
ansonsten ist es ein großer zumindest theoretischer Unterschied.
Und bevor zu was erwiderst, mir sind die "Innereien" bekannt und es
ist nunmal ein großer Unterscheid ob es eine globale Funktion ist oder
eine statische Methode.

Ich verwende beide gleich, nur daß letztere eben eine engere Beziehung zur
Klasse hat.

Quote:
Wenn du oben pingelig bist dann gefälligst auch hier!

Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?

Wenn ich z.B. sowieso ein Objekt habe, und ich nacheinander mehre
Funktionen aufrufe, die ähnliches machen, dann sieht es einfach
schöner aus, wenn die Aufrufe immer gleich sind.

Ich finde es eher unschön. Wenn die Funktion nichts mit dem Objekt zu tun
hat, sollte sich das auch in ihrem Aufruf wiederspiegeln. Nicht-static
gehört eben zum Objekt, static zur Klasse, deshalb hat bei ihrem Aufruf ein
Objekt nichts zu suchen.

Quote:
MyClass c;
c.methode1();
c.methode2();
c.methode3();

anstatt:

c.methode1();
MyClass::methode2();
c.methode3();

Und wenn ich jetzt aus irgendeinen Grund methode3() auch noch statisch
mache, weil ich es a) kann und b) sie irgendwo brauche wo ich kein
Objekt habe, dann müsste ich oberen Quellcode ändern. Ok, ich muss
nicht, aber ich bekomme eine sinnlose Warning.

Ganz sinnlos finde ich sie nicht, aber sie gehört eher in ein lint-Tool als
in einen Compiler.

Quote:
P.P.S. Diskussionen ala "welche IDE/Compiler/Sprache kennst und kannst
du eigentlich, Kleiner" auch EOD!

Wenn du in dem Zusammenhang Wörter wie "alle" oder "jeder" verwendest,
brauchst du dich über solche Antworten nicht zu wundern.
Back to top
Stefan Reuther
Guest





PostPosted: Mon Apr 30, 2007 9:11 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Rolf Magnus wrote:
Quote:
Thomas Thiele wrote:
Es ist sogar egal, was Java macht. Nicht ganz, denn Java orientiert sich
zum Großteil ob positiv oder negativ nunmal an C++.
Entscheident ist, dass die Frage auch bei C++ auftritt und ist damit
obwohl sprachübergreifend eben doch on-topic.

Streng genommen ist die Frage off-topic, da nur die Sprache selbst
diskutiert wird, und keine speziellen Tools, egal ob Compiler oder IDE.
Theoretisch sollten die Fragen nur mit Informationen aus der C++-Norm
beantwortet werden können.

Stilfragen kann man nicht mit der Norm beantworten, die sind aber
dennoch ontopic. Warnungen weisen ja oft auf Dinge hin, die man als
Stilproblem bezeichnen könnte.

Quote:
Und wenn ich jetzt aus irgendeinen Grund methode3() auch noch statisch
mache, weil ich es a) kann und b) sie irgendwo brauche wo ich kein
Objekt habe, dann müsste ich oberen Quellcode ändern. Ok, ich muss
nicht, aber ich bekomme eine sinnlose Warning.

Ganz sinnlos finde ich sie nicht, aber sie gehört eher in ein lint-Tool als
in einen Compiler.

Naja, ein aktueller gcc oder ein EDG-basierter Compiler mit voll
aufgedrehten Warnungen kann ein lint-Tool schon fast ersetzen. Man kann
C++ eh kaum sinnvoll parsen, ohne Wissen über die Zielarchitektur
mitzubringen, so dass es immer weniger sinnvoll ist, Compiler und lint
zu trennen.


Stefan

--
// gültig?
template<typename T> struct foo { typedef void* p; };
template<> struct foo<unsigned int> { static int p; };
void* x(int z) { return (foo<std::size_t>::p)&z; }
Back to top
Stefan Reuther
Guest





PostPosted: Mon Apr 30, 2007 9:11 am    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Rolf Magnus wrote:
Quote:
Stefan Reuther wrote:
Rolf Magnus wrote:
Worin siehst du eigentlich den großen Vorteil, wenn du statische
Memberfunktionen mit einem Objekt aufrufst?

Das kann z.B. nützlich sein bei sowas
template<typename T, typename Comp
void blubbersort(T zeug[], size_t count, const Comp& c) {
// ...
c.swap(...)
// ...
}
Im häufigen Fall, dass das Zugriffsobjekt 'c' keine Statusinformationen
benötigt, macht man die Funktionen statisch und das Objekt kann komplett
wegoptimiert werden.

Das geht aber mit einer nicht-statischen Funktion auch, zumindest wenn man
Comp nicht per Referenz übergibt.

Dazu muss aber der Compiler die Definition von Comp::swap() kennen, um
zu sehen, dass er den this-Zeiger wegoptimieren kann. Bei 'static'
bekommt er diese Information explizit gesagt.

Übergabe per Referenz vs. per Wert macht hier meiner Meinung nach keinen
Unterschied. Sobald die this-Zeiger der Methodenaufrufe wegoptimiert
sind, kann der Referenzparameter ebenfalls wegoptimiert werden.
Problematisch an einer Kopie ist, dass das Kopieren potenziell sehr
teuer sein kann.

Quote:
Mich wundert eigentlich, dass der operator() nicht ebenfalls statisch sein
darf.

"static" heißt hier eben "für die Klasse" statt "für das Objekt". Ich würde
erwarten, daß ein statischer operator() in der Art "Klasse()" aufgerufen
würde. Das ist aber schon die Syntax für die Erzeugung einer Instanz.

Guter Punkt.


Stefan
Back to top
Olaf Krzikalla
Guest





PostPosted: Wed May 02, 2007 3:38 pm    Post subject: Re: Aufruf von statischen Funktionen Reply with quote

Hi,

Rolf Magnus wrote:
Quote:
Ganz sinnlos finde ich sie nicht, aber sie gehört eher in ein lint-Tool als
in einen Compiler.
Aus der MSVC8 Doku:

<quote>
Level 4 displays all level 3 warnings plus informational warnings, which
in most cases can be safely ignored. This option should be used only to
provide "lint" level warnings and is not recommended as your usual
warning level setting.
</quote>

Also sollte Thomas wohl auf /W3 zurückschrauben.
Interessant im übrigen der Satz genau unter obigem Zitat:

<quote>
For a new project, it may be best to use /W4 in all compilations. This
will ensure the fewest possible hard-to-find code defects.
</quote>

Das soll nun einer verstehen...


MfG
Olaf Krzikalla
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
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.