Überladen des += Operators

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Überladen des += Operators

Beitrag von cloidnerux » Sa Apr 25, 2009 7:34 pm

Darf ich mal fragen, wozu man eigentlich getters und setters definiert,
Um zugriff auf die variable zu haben und das auch ncoh zu kontorlieren.
Es könnte ja sein, das du für eine Motorsterueng nur werte von 1 bis 1000 in einer Vraibale haben darfst.
wenn du die variable public setzt, kann der nutzer auch 2342 eintragen , folglich es würde ein fehler entsehen.
Wenn du aber eine set() hast, kannst du kontrolleiren ob die richtige größe angegeben wurde.
Redundanz macht wiederholen unnötig.
quod erat expectandum

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Überladen des += Operators

Beitrag von nufan » Sa Apr 25, 2009 7:45 pm

fat-lobyte hat geschrieben:Achso... Naja das ist etwas, was ich ein wenig obskur in C++ finde. Da das andere Objekt ja vom "gleichen" typ ist wie das jetzige, wird auf die Variablen auch nur quasi "intern" zugegriffen. Das bedeutet, private bezieht sich nicht auf das Objekt selbst (also auf Zeiger auf das Objekt) sondern auf den Typ des Objekts. Das gilt aber nur für Objekte gleichen Typs.
Hab ich glaube ich verstanden, trotzdem finde ich das ein bisschen verwirrend.
fat-lobyte hat geschrieben:Ich bin mir nichtmal sicher, ob man das auch mit funktionen machen kann die nicht der Konstruktor sind.
Also ich hab das Beispiel kompiliert und alles ging und da ist die Methode ja kein Konstruktor.
fat-lobyte hat geschrieben:Darf ich mal fragen, wozu man eigentlich getters und setters definiert, anstatt die Variable gleich Public zu machen?? Bei Kapselung gehts darum dinge Abzukapseln, was bei get/set eindeutig nicht der Fall ist. Eine andere geschichte sind allerdings "read only" member. Hier kann man durch getVariable() const Funktionen schon dinge Abkapseln.
Sorry, ich weiß nur wie es mir beigebracht wurde:
* alle Variablen private
* für jede Variable ein public Interface (get/set)
* Interface unabhängig von Implementierung (man brauch sich beim Aufruf keine Gedanken über die internen Vorgänge machen)

So wurde es mir die letzten Wochen eingetrichtert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Überladen des += Operators

Beitrag von Xin » So Apr 26, 2009 10:02 am

dani93 hat geschrieben:Sorry, ich weiß nur wie es mir beigebracht wurde:
* alle Variablen private
* für jede Variable ein public Interface (get/set)
* Interface unabhängig von Implementierung (man brauch sich beim Aufruf keine Gedanken über die internen Vorgänge machen)

So wurde es mir die letzten Wochen eingetrichtert.
Variablen über Getter UND Setter zu ziehen hat nur dann Sinn, wenn man eine Library schreibt, bzw. vorhat auf die Änderungen oder das Auslesen früher oder später zu reagieren.
Ansonsten ist der Zugriff über eine Funktion reine Zeitverschwendung, das Definieren eines Interfaces für Variablen nur überflüssiger Quelltext, wobei überflüssiger Quelltext - so primitiv er auch sein mag - nichts anderes ist als ein zusätzliches Fehlerrisiko.

Grundsätzlich Setter und Getter zu verwenden ist genauso sinnentleert, wie grundsätzlich objektorientiert zu programmieren. Beides kostet Zeit und sehr häufig (== meistens) verbrät man Rechenzeit, ohne daraus einen Vorteil zu ziehen.
Ich halte es für sinnvoller, sich anzugewöhnen, sich Gedanken zu machen, was man da eigentlich tut und Worte wie "grundsätzlich" aus seinem Denken komplett zu streichen.


Mir war dieser Thread etwas wirr beim lesen. Wenn es zur Operatorüberladung noch Fragen gibt, so bitte einfach nochmal klar posten, damit ich sie finden und zuordnen kann. In dem Fall kann ich sie vermutlich auch beantworten.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Überladen des += Operators

Beitrag von cloidnerux » So Apr 26, 2009 10:26 am

Also, ich will den = Operator überladen, sodass man dem objekt ein Wert anderen typs zuweisen kann.
z.B einen Integer.

Code: Alles auswählen

my_class my_objekt(...);
my_objekt = 12;
Überladung wird akzeptiert -> Compiler meldet keinen fehler.
Nur wenn man dann solch eine Zuweisung durchführt, nimmt der compiler die Überladung nicht an -> er meldet das er die zahl nicht in das Objekt konvertieren konnte.

Den code dazu habe ich schoneinmal gepostet.
Das ganze wurde unter C++.NET programmiert, desswegen sowas wie "ref" und "^"...

@fat-lobyte: Mit Mono kann man das auch unter linux und mac nutzen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Überladen des += Operators

Beitrag von Xin » So Apr 26, 2009 11:02 am

cloidnerux hat geschrieben:Also, ich will den = Operator überladen, sodass man dem objekt ein Wert anderen typs zuweisen kann.
z.B einen Integer.

Code: Alles auswählen

my_class my_objekt(...);
my_objekt = 12;
Überladung wird akzeptiert -> Compiler meldet keinen fehler.
Nur wenn man dann solch eine Zuweisung durchführt, nimmt der compiler die Überladung nicht an -> er meldet das er die zahl nicht in das Objekt konvertieren konnte.
Es wäre mal interessant, wenn Du die Zeile markierst, in der der Compiler den Fehler meldet.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Überladen des += Operators

Beitrag von cloidnerux » So Apr 26, 2009 1:14 pm

Es ist genau so eine zeile:

Code: Alles auswählen

hexstring^ data;
...
data = 12;    //<- Fehler: Kann nicht in hexstring konvertiert werden
Die komplette Klasse hexstring habe ich ja schon gepostet.

Wobei erwähnt werden muss, das eine int zuweisung im auch in einer Überladung des konstruktors stattfindet.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Überladen des += Operators

Beitrag von Xin » So Apr 26, 2009 1:52 pm

cloidnerux hat geschrieben:Es ist genau so eine zeile:

Code: Alles auswählen

hexstring^ data;
...
data = 12;    //<- Fehler: Kann nicht in hexstring konvertiert werden
Die komplette Klasse hexstring habe ich ja schon gepostet.

Wobei erwähnt werden muss, das eine int zuweisung im auch in einer Überladung des konstruktors stattfindet.
Ein (hexstring ^) ist ein Objekt, das NULL sein darf.
Wie gesagt... ich bin nicht besonders Firm mit C++.NET, aber das würde für mich bedeuten, dass das entsprechend eines Pointers erst Dereferenzieren muss, bevor ich das Objekt wirklich in der Hand habe.
Was sagt er also bei

Code: Alles auswählen

(*data) = 12;
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Überladen des += Operators

Beitrag von cloidnerux » So Apr 26, 2009 2:10 pm

Code: Alles auswählen

(*data)  = 12; 
nimmt er anstanslos.
Wie gesagt... ich bin nicht besonders Firm mit C++.NET
Ich ja auch nicht wirklich, aber soweit ich weiß wird durch den parameter ref vor der Klassendefinition nagegeben das es aufm gc-Stack/heap/was auch immer liegt und soamit eine refernzierung über gcnew braucht, alles ein haufen ********** mit dem .NET kram.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Überladen des += Operators

Beitrag von fat-lobyte » So Apr 26, 2009 4:30 pm

dani93 hat geschrieben:Hab ich glaube ich verstanden, trotzdem finde ich das ein bisschen verwirrend.
Ist ja auch ziemlich blöd finde ich...
dani93 hat geschrieben:Sorry, ich weiß nur wie es mir beigebracht wurde:
* alle Variablen private
* für jede Variable ein public Interface (get/set)
* Interface unabhängig von Implementierung (man brauch sich beim Aufruf keine Gedanken über die internen Vorgänge machen)
Mir wurde zwar nichts "Beigebracht" im klassischen Sinne, allerdings habe ich gelernt dass es Grundsätzlich keine Gesetze in der Programmierung gibt. Ich halte sehr wenig davon einige Features zu "verbieten" und andere anzupreisen. Als konkrete Beispiele finde ich sollte man goto icht verbieten, auf der anderen Seite is OOP nicht die Lösung für alles.
"Situationsabänging" ist das Schlagwort. Du solltest tun, was du in einer Situation für richtig erachtest. Frag dich einfach selbst, und denke über den Sinn nach: Was bringt eine Klasse, dessen einzige Funktionen getters und setters sind?
cloidnerux hat geschrieben: Die komplette Klasse hexstring habe ich ja schon gepostet.
Ähm... Kann gut sein dass ich zu blöd bin das zu finden... Aber du hast die Klasse nicht in diesem Thread gepostet, und eine Forensuche nach hexstring hat auch nichts ergeben. Ist das so eine Art supergeheimes Projekt an dem du arbeitest? Oder hältst du Patente auf einen genialen Algorithmus? Falls nicht wäre es wirklich sehr hilfreich wenn du den Code mal posten könntest.

Haben sich ansonsten alle dein Fragen aufgeklärt?
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Überladen des += Operators

Beitrag von cloidnerux » So Apr 26, 2009 4:45 pm

Ähm... Kann gut sein dass ich zu blöd bin das zu finden... Aber du hast die Klasse nicht in diesem Thread gepostet, und eine Forensuche nach hexstring hat auch nichts ergeben. Ist das so eine Art supergeheimes Projekt an dem du arbeitest? Oder hältst du Patente auf einen genialen Algorithmus? Falls nicht wäre es wirklich sehr hilfreich wenn du den Code mal posten könntest.
Auf seite 1 dieses Threds ziemlich wiet unten in einem meiner beiträge habe ich zwei codes gepostet, die der Kompletten Klasse hexstring entsprechen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten