C++ Sonderzeichen als Funktionsnamen? (+,#,& ...)

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo.

Kann man C++ irgendwie so einrichten, dass ich auch mit Sonderzeichen für Funktionsnamen arbeiten kann? Würde recht nett aussehen. Wenn ich zum Beispiel eine Klasse habe wo man Flächen addieren kann. Dann mache ich mir eine Funktion "Addition". Jetzt statt den Funktionsnamen "Addition" einfach "+" als Name. Dann kann man einfach
PHP:
Obj1.+(Obj2)

Also ich finde das sieht sau geil aus. Wie mache ich das unter C++? Weil so ohne weiteres kriege ich nur Fehlermeldungen das ich das nicht darf.

Gruß
 
Dafür gibt es die Operatorüberladung. Und nein, nur alphanumerische Zeichen ohne Umlaute und Sonderzeichen sind erlaubt.
 
du kannst in c++ eigene operatoren definieren. damit kannste dann einfach obj1+obj2 schreiben.
bsp: vektor operator+(const vektor &a, const vektor &b);
 
Hi und Danke. Hm, das ist aber doof :/ Naja und das mit den Operatorüberladung, verstehe ich noch nicht ganz, aber sieht nach unnötig viel arbeit aus. Das lohnt sich jetzt glaube ich nicht wirklich, damit das am ende einfach nur "besser" aussieht. TJA schade, dass C++ nicht mal so einfache Sachen kann... ist doch irgendwie nicht die Welt mal auch Sonderzeichen für Funktionsnamen zu erlauben :/

Gruß
 
Zeboo schrieb:
TJA schade, dass C++ nicht mal so einfache Sachen kann... ist doch irgendwie nicht die Welt mal auch Sonderzeichen für Funktionsnamen zu erlauben :/

Gruß

Das ist schon Absicht so. Was meinste wie bei manchen Leuten der Code aussähe, wenn sowas möglich wäre? Will ich mir gar nicht vorstellen, also ist schon ganz vernünftig so wies ist.
Die eigenen Operatoren zu implementieren finde ich aber eigentlich nicht umständlich und vor allem ist es teilweise sehr wichtig, dass der Code besser aussieht.
 
Zeboo schrieb:
Naja und das mit den Operatorüberladung, verstehe ich noch nicht ganz, aber sieht nach unnötig viel arbeit aus. Das lohnt sich jetzt glaube ich nicht wirklich, damit das am ende einfach nur "besser" aussieht.
Oben schreibst du, dass du es gerne wölltest, aber hier schreibst du, dass es unnötig viel Arbeit ist, nur damit es "besser aussieht". Genau das was du willst, negierst du gerade. Was willst du denn nun?

Um ein + bei eigenen Objekten zu verwenden, musst du lediglich
Code:
Klasse operator +( const Klasse &Objekt 1, const Klasse &Objekt2 )
{
  Klasse neuesObjekt;
  // ...
  return neuesObjekt;
}
verwenden. Was ist daran unnötige Arbeit?

Weitere Stichworte sind Semantik, Einheitlichkeit und Übersichtlichkeit. Was meinst du, wie Code aussehen würde, welcher z.B. neuesObjekt = Objekt1 # Objekt2 nutzen würde? Keiner würde den Sinn dahinter verstehen, außer man sieht sich die Dokumentation an. Wenn dies jeder macht, musst du, um die Funktionsweise zu verstehen, jedes mal die Dokumentation lesen, nur um zu wissen was Operator a und was b macht. Nicht im Sinne des Erfinders.
 
kinglouy schrieb:
Das ist schon Absicht so. Was meinste wie bei manchen Leuten der Code aussähe, wenn sowas möglich wäre? Will ich mir gar nicht vorstellen, also ist schon ganz vernünftig so wies ist.
Die eigenen Operatoren zu implementieren finde ich aber eigentlich nicht umständlich und vor allem ist es teilweise sehr wichtig, dass der Code besser aussieht.

Da muss ich dir widersprechen. Nachdem ich etwas Scala und Python gemacht habe, gibt es tolle Sachen was man sich erlauben kann. Zum Beispiel:

PHP:
boolean existiert?(wert a) {
  if (bla ...)
     return false
   return true
}

obj1.existiert?(wert)

boolean schön?() {
  ...
}

obj2.schön?

Das sieht mal verdammt leserlich aus. Man muss keine () hinschreiben und ? ist auch erlaubt. Ich könnte jetzt einfach prüfen ob es im Obj1 wert a drinne ist oder existiert (obj1.existiert?). Mit so Sachen kann man schon fast so Coden wie man eigentlich reden würde. Und das war nur ein doofes Beispiel, geht alles noch viel schöner. Wollte nur zeigen, dass doch nicht so ein Unsinn ist wie einige meinen.

Gruß
 
Zuletzt bearbeitet:
aso deutsche Namen sind eh naja...
oftmals kann man ja noch ein "is" davor schreiben...

z.B.
if (apple.isRed()) ...

Allerdings geht das bei Verben meistens nicht wirklich... aber exists finde ich auch komisch
da macht
obj1.contains(wert)
irgendwie auch mehr sinn...

Und da die Methoden ja meist in Abfragen oder Zuweisungen benutzt werden ist doch schon implizit, dass es sich um ne "Frage" handelt...
 
Hier redet keiner von Unsinn, sondern von Konsistenz. Es war von Anfang an nicht erlaubt irgendwelche Sonderzeichen in Funktions- und Variablennamen mit einzubeziehen, wieso also auf einmal anfangen? Nur weil es andere Sprachen erlauben, ist C deshalb nicht doof oder sonst etwas, sondern nur anders. Weiterhin kannst du mit Preprocessor Konstrukten auch viele Sachen erschaffen, aber ebenso Unsinn kreieren.

Was spricht bei deinem Beispiel gegen ein obj1.IsExistent( wert )? Einen wirklichen Mehrwert hast du bei existent? nicht, es wird nur anders umschrieben.

Nebenbei gefällt mir dieses Sonderzeichen-im-Funktionsnamen-untergebringe auch überhaupt nicht.
 
Also vor allem wirds dann cool...
Ich hab ne Variable die heißt "a+b"... oder wie? Und dann noch Variable a... und noch ne Variable b... was heißt dann a+b?

und meint "existert?" dass es darum geht, dass eine Variable, die "existiert" heißt wahr ist und dann der Ausdruck hinter dem Fragezeichen interpretiert werden soll also in einer solchen Syntax:
existiert?print("ja") : print("nein")

Es ist sinnvoll da für Klarheit zu sorgen...

Ich meine ne Zeile
if (obj.exists(a)) {
sieht schon leserlicher aus als
obj.exists(a)
weil was macht denn die zeile drüber? Irgendwie nichts... zumindest würde ich nicht annehmen, dass die was macht, weil die schaut ja nur ob es a gibt und verwirft dann das Ergebnis...
 
Zuletzt bearbeitet:
Zeboo schrieb:
. TJA schade, dass C++ nicht mal so einfache Sachen kann... ist doch irgendwie nicht die Welt mal auch Sonderzeichen für Funktionsnamen zu erlauben :/


So einfach ist das auch wieder nicht. Ich kenne die gängigen C++ Compiler nicht, aber solange deren lexikalische Einheit auf regulärer Grammatik beruht wird ein Zeichen wie "+" im Namen niemals möglich sein. Da müsste man am Scanner schon starke Veränderungen vornehmen.
 
Zeboo schrieb:
Hi und Danke. Hm, das ist aber doof :/ Naja und das mit den Operatorüberladung, verstehe ich noch nicht ganz, aber sieht nach unnötig viel arbeit aus. Das lohnt sich jetzt glaube ich nicht wirklich, damit das am ende einfach nur "besser" aussieht. TJA schade, dass C++ nicht mal so einfache Sachen kann... ist doch irgendwie nicht die Welt mal auch Sonderzeichen für Funktionsnamen zu erlauben :/

Gruß


Nachdem dir Yuuri jetzt genau gezeigt hat, wie's geht, empfindest du es immer noch als zu schwer oder als unnötigen Aufwand? Ich meine, das ist doch wirklich genau das, wonach du in deinem Eröffnungsbeitrag gefragt hast.
 
Zeboo schrieb:
Hallo.

Kann man C++ irgendwie so einrichten, dass ich auch mit Sonderzeichen für Funktionsnamen arbeiten kann? Würde recht nett aussehen. Wenn ich zum Beispiel eine Klasse habe wo man Flächen addieren kann. Dann mache ich mir eine Funktion "Addition". Jetzt statt den Funktionsnamen "Addition" einfach "+" als Name. Dann kann man einfach
PHP:
Obj1.+(Obj2)

Also ich finde das sieht sau geil aus. Wie mache ich das unter C++? Weil so ohne weiteres kriege ich nur Fehlermeldungen das ich das nicht darf.

Gruß

Sonderzeichen in einem Funktions- oder Methodennamen sind nicht zulässig!
vgl. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdf (2.11)

Da dies auch in fast allen anderen Programmiersprachen der Fall ist, kann ich dir nur von abraten so etwas in Scala etc. zu verwenden. Der Lesbarkeit ist das jedenfalls nicht zuträglich!
 
Zuletzt bearbeitet:
kinglouy schrieb:
Das ist schon Absicht so. Was meinste wie bei manchen Leuten der Code aussähe, wenn sowas möglich wäre? Will ich mir gar nicht vorstellen, also ist schon ganz vernünftig so wies ist.
Die eigenen Operatoren zu implementieren finde ich aber eigentlich nicht umständlich und vor allem ist es teilweise sehr wichtig, dass der Code besser aussieht.

Zitat aus Einführung in die Programmierung mit C++(Seite: 332) von Bjarne Stroustrup(Designer und Erfinder von C++)

Grundsätzlich kann man sagen, dass es besser ist, keine Operatoren für einen Typ zu definieren, es sei denn, Sie wären sich sicher, dass es ihren Code entscheident verbessert. Außerdem sollten Sie beim Definieren von Operatoren deren ursprüngliche Bedeutung erhalten...
 
Schön, dass sich die STL selbst nicht daran hält... man denke nur mal an Streams und die Operatoren << und >>...
 
ich würde mit << und >> schieben asoziieren. Ob das nun bits oder streams sind ist wohl nicht wirklich ein logischer Unterschied.

Was allerdings total im Wiederspruch stehen würde wäre eine Addition auf den Minus Operator zu überladen. Das würde auch gegen die besagte Buchquelle und gegen jede Logik sprechen.
 
Das was die STL mit Streams macht, finde ich wiederum vollkommen OK. Ich würde zumindest nicht wie in Java o.ä. wollen, dass ich bei jeder Zeile ein println() schreiben müsste. Ein cout reicht und bei jedem Zeilenumbruch oder Flush ein endl anhängen und gut ist. Alle anderen Operatoren wie +, - usw. wären unlogisch, daher finde ich << und >> ganz praktisch. Desweiteren kann man den Stream auch ganz leicht über z.B. setw u.ä. sehr leicht modifizieren kann. Auch die nicht benötigte Konvertierung von Variablen in String ist somit überflüssig.

Ich finde man sollte auch zwischen Konsistenz und praktischem Nutzen abwägen.
 
Yuuri schrieb:
Ich finde man sollte auch zwischen Konsistenz und praktischem Nutzen abwägen.

Finde ich auch. Man kann an C++ sicherlich viel bemängeln, aber es gibt auch ein paar Dinge, die es richtig macht. :)
 
Zurück
Oben