obj.Length == 0 or obj.Length() == 0
-
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