Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Pointer-Problem: illegal indirection (https://www.delphipraxis.net/102976-%5Bc-%5D-pointer-problem-illegal-indirection.html)

OregonGhost 7. Nov 2007 21:41

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von Khabarakh
Die normale Klammer "(a)" ist kein Operator (jedenfalls habe ich noch nie gelesen, dass sie als ein solcher irgendwo definiert wird), in einer prozessornäheren UPN-Schreibweise würde sie ja auch wegfallen. Überladen lässt sie sich einmal als Cast-Operator "(a)b" und einmal als Function-Call-Operator "f()". Zum Komma sage ich lieber nichts, denn nachdem ich wie du gerade zum ersten Mal überhaupt von ihm gehört habe, will ich ihn bis morgen lieber wieder vergessen ;) .

Ja, ich habe vor ein paar Tagen zum ersten mal den Komma-Operator ernsthaft in einer Funktion benutzt, sogar relativ sinnvoll, und ich fühle mich ganz schmutzig. Dabei habe ich ihn nicht einmal überladen. Ich habe den entsprechenden Bereich stilecht mit
Code:
// HERE BE DRAGONS
kommentiert. Seltsamerweise habe ich ein paar Tage später (wenn ich so drüber nachdenke, es war heute) Code von jemand anderem gesehen, der auch auf seltsame Weise Gebrauch von diesem Operator machte.

Aber so ist das eben. Der Sprache selbst fehlen so viele praktische und heutzutage selbstverständliche Features, dafür hat sie so viele obszöne und esoterische Features, dass man damit fast alles machen kann, auch Dinge hinzufügen, die so nie vorgesehen waren, oder sich etwas syntaktische Vereinfachung verschaffen, indem man sie zweckentfremdet. Aber das lässt man lieber andere machen.

DMW 7. Nov 2007 21:42

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von Khabarakh
Wenn ich das richtig sehe, enthält das Array ja gar keine Zeiger, sondern direkt die Objekte (so langsam verstehe ich, warum C++ mit diesem Konzept ziemlich allein auf weiter Flur steht *g*)

Ja? Da bin ich aber gespannt :mrgreen:


Vom Überladen würde ich auch die Finger lassen, bis du einen guten Grund findest. Wenn du nicht unbedingt mathematisch orientierte Klassen schreibst (für die auch nur die arithmetischen Operatoren zu überladen wären, und das ist ja noch im Rahmen), wirst du das ohnehin kaum selbst machen müssen. Für die meisten Szenarien, in denen eine Überladung weiterer Operatoren sinnvoll wäre, gibt es in der STL (und natürlich in Boost) schon fertige Implementationen.

Daß man ->, [] und das unäre * überladen kann, ist übrigens für Iteratoren und Smart-Pointer essentiell. Letztere sind übrigens, wenn sinnvoll eingesetzt, so bequem wie ein Garbage-Collector, ohne mit dessen Nachteilen behaftet zu sein ;)

Es gibt allerdings tatsächlich einige Operatoren, die man nie überladen sollte, z.B. &&, || und , . Weiß der Geier, weshalb die Möglichkeit überhaupt besteht.

Und verkettete Listen indiziert man nicht einmal in C++ ;)


Zitat:

Zitat von OregonGhost
Der Sprache selbst fehlen so viele Features, dafür hat sie so viele obszöne und esoterische Features, dass man damit fast alles machen kann, auch Dinge hinzufügen, die so nie vorgesehen waren

Das ist doch gerade das schöne ;)


Zitat:

Zitat von OregonGhost
Aber das lässt man lieber andere machen.

Ich mache das eigentlich ganz gerne :mrgreen:

OregonGhost 7. Nov 2007 21:50

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von DMW
Zitat:

Zitat von Khabarakh
Wenn ich das richtig sehe, enthält das Array ja gar keine Zeiger, sondern direkt die Objekte (so langsam verstehe ich, warum C++ mit diesem Konzept ziemlich allein auf weiter Flur steht *g*)

Ja? Da bin ich aber gespannt :mrgreen:

Zugegeben, das ist eins der Features, das ich in dieser Form in anderen Sprachen vermisse. Auch wenn das mit Polymorphie schon wieder einen größeren Aufwand erfordert (jedoch, anders als in anderen Sprachen, keineswegs unmöglich und mit ein wenig Template-Code sogar relativ elegant zu erreichen ist).
Zitat:

Zitat von DMW
Für die meisten Szenarien, in denen eine Überladung weiterer Operatoren sinnvoll wäre, gibt es in der STL (und natürlich in Boost) schon fertige Implementationen.

Man kann sich sicherlich darüber streiten, ob es sinnvoll ist, die Shift-Operatoren als Stream-Operatoren zu überladen oder den Modulo für Stringformatierung :mrgreen:

DMW 7. Nov 2007 21:54

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von OregonGhost
Man kann sich sicherlich darüber streiten, ob es sinnvoll ist, die Shift-Operatoren als Stream-Operatoren zu überladen

Da braucht man gar nicht zu streiten. Ich finde die Dinger so grauenvoll wie du ;)


Zitat:

Zitat von OregonGhost
oder den Modulo für Stringformatierung :mrgreen:

Du meinst in printf? Das ist aber keine Operatorüberladung, sondern ein Relikt aus C (deshalb gibts da auch eigentlich keine Typsicherheit - aber auch das läßt sich mit C++ natürlich ändern ;) ). Und ich finde es _viel_ besser als die Streamoperatoren ;)

OregonGhost 7. Nov 2007 21:59

Re: [C++] Pointer-Problem: illegal indirection
 
Nein, boost::format verwendet den Modulo-Operator dafür. Nach dem Motto
Code:
boost::format("%1%, %2%") % "Hallo" % "Welt"
Hat interessante Vorteile, speziell im Vergleich zu Stream-Operatoren oder dem QString::arg() (oder, davon abgesehen, gegenüber printf). Ist in meinen Augen aber noch mehr zweckentfremdet.

Torpedo 7. Nov 2007 22:05

Re: [C++] Pointer-Problem: illegal indirection
 
Ich weiß nicht was ihr alle gegen einen []-Operator bei verketteten Listen habt. Man muss doch nicht bei jedem Zugriff die ganze Kette durchlaufen. :)
Code:
TStringList strl;
strl.add("Hallo");
strl.add("Welt");
for(int i = 0; i<strl.count(); i++)
  cout<<strl[i]<<"\n";
Den Such-Zeiger in der Liste muss man ja nicht jedes mal wieder an den Anfang setzen.
Aber kann schon sein, dass es bei verketteten Listen nicht benutzt wird.
Ein anderes Beispiel, wo es sicher benutzt wird, wäre zum Beispiel eine Klasse für Vektor-Berechnungen.
v3 = v1 + v2;
anstatt
v3 = v1.add(v2);

Dax 7. Nov 2007 22:06

Re: [C++] Pointer-Problem: illegal indirection
 
Da wäre das Komma doch passender gewesen.. *g*

DMW 7. Nov 2007 22:11

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von OregonGhost
Nein, boost::format verwendet den Modulo-Operator dafür. Nach dem Motto
Code:
boost::format("%1%, %2%") % "Hallo" % "Welt"

Stimmt, das gibts ja auch noch. Aber auch da präferiere ich printf.

boost.serialization verwendet auch <<, >> und & für das Streamen eines Wertes :shock:

OregonGhost 7. Nov 2007 22:18

Re: [C++] Pointer-Problem: illegal indirection
 
Naja, printf ist halt nicht zu gebrauchen, wenn man eine Anwendung international gestalten will, unterstützt keine benutzerdefinierten Typen und auch keine umgeleiteten Streams. Damit ist es zumindest für meinen Entwickleralltag vollkommen nutzlos. Streams sind, was Internationalisierung betrifft, natürlich auch nicht zu gebrauchen. Praktischerweise kann man boost::format aber in Streams schieben.
Hmm.
Wenn ich so drüber nachdenke... DESHALB hat man wohl die Shift-, sprich Schiebe-Operatoren dafür benutzt... um Dinge in den Stream hineinzuschieben :wall:

Was DAX' scherzhafte Bemerkung zum Kommaoperator angeht: Ich tippe mal, dass das auch der erste Gedanke der Boost-Leute war. Blöderweise kann man dann einen format-Aufruf nicht als Parameter übergeben, weil das Komma dann als Parameter-Trenner statt als Operator interpretiert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz