Ich versteh den operator *() in C++ nicht!
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
-
-
-
Guter Mann, warum codest du ganz was anderes zusammen als im beispiel erwähnt ist?
hier der gekürzte code:
C-Quellcode
- #include <iostream>
- #include <netinet/in.h>
- class Example
- {
- public:
- Example (){}
- virtual operator struct sockaddr *() = 0;
- };
- class ExampleSub : public Example
- {
- public:
- ExampleSub()
- {
- s.sin_len = 123;
- s.sin_family = 45;
- s.sin_port = 6789;
- }
- virtual operator struct sockaddr *()
- {
- return (sockaddr *)&s;
- }
- private:
- int blub;
- char *bla;
- struct sockaddr_in s;
- };
- void foo(Example* ex)
- {
- printf("ex: %p\n", ex);
- struct sockaddr *s = *ex;
- printf("s: %p\n", s);
- printf("len: %i\n", s->sa_len);
- printf("family: %i\n", s->sa_family);
- //struct sockaddr *s2 = **ex; // error: cannot convert 'sockaddr' to 'sockaddr*' in initialization
- }
- int main ()
- {
- ExampleSub ex;
- foo(&ex);
- }
-
gritsch schrieb:
Guter Mann, warum codest du ganz was anderes zusammen als im beispiel erwähnt ist?
Wann fängst Du endlich an zu begreifen, daß das kein gültiger C++ Code ist! Nur weil es der Compiler übersetzt ist es nicht automatisch korrekt!
- Du fragtest in Deinem original Post explizit in der Überschrift nach operator*. Exakt dessen korrekte Verwendung habe ich Dir erklärt.
- Wenn es nicht um die korrekte Verwendung von operator* geht, was soll das überhaupt für ein Operator sein? Der ganze Code sieht danach aus, daß jemand mit wenig C++ Kenntnis krampfhaft an C-Codestil festhält und so massenweise Seiteneffekte des Compilers triggert.
- Was soll dieses ständige "struct sockaddr", das ist C++ und kein C! Weg damit, das überdeckt nur Fehler.
- C-Cast haben in C++ grundsätzlich in neuem Code nichts mehr zu suchen. Einzig in extern "C" Blöcken ergibt das bedingt Sinn, aber auch dort sollte man Cast vermeiden.
- Du fragtest in Deinem original Post explizit in der Überschrift nach operator*. Exakt dessen korrekte Verwendung habe ich Dir erklärt.
-
Dann ist es eben der () operator. dazu gibts ja den code. nicht am titel verbeißen.
dann zeig doch mal wies korrekt ist anhand meinem letzten beispielcode.
und struct sockaddr muss sein (connect, accept etc) -
gritsch schrieb:
Dann ist es eben der () operator.
Nein, denn ein korrekter Code mit dem operator() sieht ungefähr so aus.
-
tjp schrieb:
gritsch schrieb:
Dann ist es eben der () operator.
Nein, denn ein korrekter Code mit dem opterator() sieht ungefähr so aus.
dann verrat mir doch bitte was "operator struct sockaddr *()" ist. danke! -
gritsch schrieb:
dann verrat mir doch bitte was "operator struct sockaddr *()" ist. danke!
Ich schaue heute in die ISO Norm. Danach eine Antwort. -
Ich dachte, es waren sich alle einig, dass es sich um den (einen) Cast-Operator handelt? Worum geht die Diskussion jetzt?!♥C++
-
zerm schrieb:
Worum geht die Diskussion jetzt?!
Darum, dass dieser Cast bei einigen Compilern wohl zu Fehlern führt oder so.
Kennst du das Phänomen des Ochs' vorm Berg bzw. des Ochs' mit Blick aufs Uhrwerk? So fühl ich mich immer in diesem Teil des Forums. ^^«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
Iä-86! Iä-64! Awavauatsh fthagn!
kmr schrieb:
Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
-
Ja, weil er doppelt (einmal zu viel) dereferenziert wird?!♥C++
-
zerm schrieb:
Ja, weil er doppelt (einmal zu viel) dereferenziert wird?!
ich glaube es gibt keinen compiler der den samplecode von mir compilieren würde (mit ** wie er meint dass es korrekt wäre) -
Das ergibt doch auch keinen Sinn.
"ex" ist von Typ "Example*"
also "*ex" vom Typ "Example". Nur an "Example" ist der Cast-Operator definiert - aber kein Derefencing-Operator.♥C++ -
BTW, gritsch: Ich würde Dir dennoch raten (sofern möglich), lieber boost::asio für Socket-Kommunikation zu verwenden. Es ist ein Traum, und auch gleich noch Cross-Plattform. Und man vermeidet, das ganze Polling/select etc., was einfach mal nur Fehlerträchtig und sehr schnell sub-optimal in der Performance ist.♥C++
-
zerm schrieb:
Das ergibt doch auch keinen Sinn.
"ex" ist von Typ "Example*"
also "*ex" vom Typ "Example". Nur an "Example" ist der Cast-Operator definiert - aber kein Derefencing-Operator.
hab ich ja gesagt aber er behauptet was anderes. -
zerm schrieb:
BTW, gritsch: Ich würde Dir dennoch raten (sofern möglich), lieber boost::asio für Socket-Kommunikation zu verwenden. Es ist ein Traum, und auch gleich noch Cross-Plattform. Und man vermeidet, das ganze Polling/select etc., was einfach mal nur Fehlerträchtig und sehr schnell sub-optimal in der Performance ist.
jep, kenne ich - verwend ich auch in einem anderen projekt, doch in dem fall muss ich fremdcode warten bzw erweitern