obj.Length == 0 or obj.Length() == 0
-
z.B. ich benutze eine Methode aus irgendeiner String Class(nicht STL), hier Length()
es sollte mir einen Int-wert zurückliefern, dann von aussen checke ich ob es null ist, etwa so:if (obj.Length() == 0) { ... } else { ... }aus Versehen habe ich die beiden Klammen vergessen, aber der Compiler(nicht unbedingt ms c++ Compiler) gibt keine Warning und Error aus.
ich habe mal rumgefragt, jemand hat mir erklärt, weil die Funktion keine Paramether besitzt, dann kann man auch so schreiben, weil obj.Length ist eben eine Funktionspointer, was auf Length() zeigt, ist es so? und ist diese Schreibweise Compiler abhängig? ist es überhaupt c++ standard?
-
obj.Length ist tatsächlich ein Funktionspointer (hmm oder nennt man das in dem Fall einen Methodenpointer?). Naja auf jeden Fall rufst du hier nicht wie aus manch anderen Programmiersprachen gewohnt Length() auf - dein Ergebnis ist ohne Klammern nicht das Gewünschte.
Edit: Es sei denn diese String-Klasse von dir besitzt ein Public-Attribut "Length". Das glaube ich dann aber doch nicht. Falls Length eine Methode ist, ist das auszuschließen imho.
MfG SideWinder
-
Hallo
also beim GNU-Compiler kommt bei sowas die Fehlermeldung : invalid use of member.
Aber selbst wenn es kompiliert macht es bestimmt nicht was du erwartest, nämlich die Methode ausführen. Wenn Length ein Funktionspointer wäre, wäre das ja noch korrekt, aber einer Methode an sich kann kein Wert zugewiesen werden.
Die Klammern gehören einfach syntaktisch dahin./Edit : zu langsam... Test hat zu lange gedauert.
bis bald
akari
-
obj.Length ist tatsächlich ein Funktionspointer...
dein Ergebnis ist ohne Klammern nicht das Gewünschte.Wenn Length ein Funktionspointer wäre, wäre das ja noch korrekt
?????
Edit: Es sei denn diese String-Klasse von dir besitzt ein Public-Attribut "Length". Das glaube ich dann aber doch nicht. Falls Length eine Methode ist, ist das auszuschließen ...
es gibt kein Attribute "Length"
-
Korrekt im Sinne von "die Syntax ist korrekt". Es wird getestet ob die Adresse der Funktion Length == 0x0 ist. Allerdings wird die Funktion Length nicht aufgerufen.
Syntax ok.
Semantik falsch.MfG SideWinder
-
dann habe ich wieder was getestet
int a = (int)obj.Length;es klappt nicht, wieso?
-
und
if (obj.Length == 0)es wird ja niemals erfüllt, nicht wahr?
-
zu 1. Weil sich Pointer-to-Member niemals in integrale Typen casten lassen.
zu 2. Ja.
-
aber wenn obj.Length nur eine Adresse ist, wieso kann es nicht zu einem Int gecastet werden?
-
netrobot schrieb:
und
if (obj.Length == 0)es wird ja niemals erfüllt, nicht wahr?
Naja, wenn du Length als rein virtuelle Methode definierst (was hier ja keinen Sinn macht...ist auch nur hypotetisch) und sie statisch wär (also die Klasse in der Length definiert wär, abstrakt wär), schon.
-
CodeFinder schrieb:
netrobot schrieb:
und
if (obj.Length == 0)es wird ja niemals erfüllt, nicht wahr?
Naja, wenn du Length als rein virtuelle Methode definierst (was hier ja keinen Sinn macht...ist auch nur hypotetisch) und sie statisch wär (also die Klasse in der Length definiert wär, abstrakt wär), schon.
class Base { public: void foo() = 0; }; class Derived : public Base { public: void foo(){}; } Base *B = new Derived; //or Derived *D = new Derived; B->foo(); //or D->foo();hier foo ist nicht 0
-
hier gehts eigentlich nicht um virtuale funktionen,sondern wieso
int a = (int)obj.Length;klappt nicht, wenn obj.Length ist ein Funktionszeiger(Adress), kann ich natürlich auch zu int casten, die sind alle 32 bits lang
-
netrobot schrieb:
z.B. ich benutze eine Methode aus irgendeiner String Class(nicht STL), hier Length()
es sollte mir einen Int-wert zurückliefern, dann von aussen checke ich ob es null ist, etwa so:if (obj.Length() == 0) { ... } else { ... }aus Versehen habe ich die beiden Klammen vergessen, aber der Compiler(nicht unbedingt ms c++ Compiler) gibt keine Warning und Error aus.
ich habe mal rumgefragt, jemand hat mir erklärt, weil die Funktion keine Paramether besitzt, dann kann man auch so schreiben, weil obj.Length ist eben eine Funktionspointer, was auf Length() zeigt, ist es so? und ist diese Schreibweise Compiler abhängig? ist es überhaupt c++ standard?nur wenn Length eine statische memberfunktion ist, kann obj.Length so verwendet werden. in diesem falle bewirkt der == operator zunächst eine konvertierung in einen funktionspointer, und der folgende vergleich mit 0 wird natürlich niemals wahr sein. falls Length nicht statisch ist (und davon kann man wohl ausgehen), dann ist der ausdruck obj.Length ein rvalue (eines im standard spezifizierten typs, was uns aber nicht interessieren muss, dann diesen typ kann man nicht selbst deklarieren). dieser ausdruck darf nur dazu benutzt werden, um einen funktionsaufruf (per () ) durchzuführen. jede andere verwendung ist nicht standardkonform (5.2.5/4).
verschiedene compiler besitzen hier spracherweiterungen - ms vc++ bis version 7.1 behandeln diesen ausdruck wie einen pointer (einen korrekten aufruf könnte man wohl aber nur mittels assembler realisieren). auch der borland compiler besitzt meines wissens eine vergleichbare erweiterung.
-
netrobot schrieb:
CodeFinder schrieb:
netrobot schrieb:
und
if (obj.Length == 0)es wird ja niemals erfüllt, nicht wahr?
Naja, wenn du Length als rein virtuelle Methode definierst (was hier ja keinen Sinn macht...ist auch nur hypotetisch) und sie statisch wär (also die Klasse in der Length definiert wär, abstrakt wär), schon.
class Base { public: void foo() = 0; }; class Derived : public Base { public: void foo(){}; } Base *B = new Derived; //or Derived *D = new Derived; B->foo(); //or D->foo();hier foo ist nicht 0
Ach ne....hast du meinen Post überhaupt gelesen ?
-
Naja, wenn du Length als rein virtuelle Methode definierst (was hier ja keinen Sinn macht...ist auch nur hypotetisch) und sie statisch wär (also die Klasse in der Length definiert wär, abstrakt wär), schon.
virtuelle methode kann bei der Benutzung auch nicht 0 sein