Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zuweisungsoperator klasse auf gleiche klasse mit parametern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.11.2007, 10:55 Uhr
lordhelmchen



Hi,

ich hänge fest.
Ich möchte einer Instanz einer Klasse XY eine Teilmenge einer anderen Instanz der Klasse XY zuweisen:

XY obj_1,obj_2;

obj_1=obj_2.teilmengebilden(int anzahl);

die Memberfunktion teilmengebilden(int anzahl) gibt zum Beispiel die ersten anzahl werte zurück.

Wie implementiere ich das? Welche Kopier,Zuweisungsoperatoren benötigt man?


merci im Vorraus
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.11.2007, 13:24 Uhr
stephanw
localhorst


Im einfachsten Fall müsste dazu die Funktion "teilmengebilden()" ein Objekt vom Typ "XY" zurückgeben, das dann eben an obj_1 zugewiesen wird. Der Compiler generiert ja selbst einen Zuweisungsoperator. Ob Du einen eigenen anbieten musst, hängt von der Klasse XY ab und kann man nicht pauschal sagen.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.11.2007, 14:04 Uhr
lordhelmchen



Oh mann
selbstverständlich ist das so. Mein Problem war völlig anders gelagert. Ich hab die Klasse XY von einem "Borland Builder Jünger" bekommen und sollte sie erweitern. Dort waren die Referenzen im Copykonstruktor nicht als "const XY& uebergabeparameter" sondern nur als "XY& uebergabeparameter" ausgeführt.
Mit devc++ gibts solchen schlendrian nicht. der borland läßt defaultmäßig anscheinend alles durchgehen.sogar void main(void)... und die alten c header.

Trotzdem danke für die Antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.11.2007, 16:14 Uhr
stephanw
localhorst


Dann verstehe ich Dein Problem nicht :-( .

Dass der Copy-Ctor des Borland Jüngers keine konstante Referenz erwartet, ist zwar merkwürdig und sehr unschön, sollte aber kompilieren. Der std::auto_ptr z.B. macht das auch so, weil er dem Quellobjekt die Eigentümerschaft rauben muss.
Aber was hat das mit dem Bilden der Teilmenge zu tun ?
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 14.11.2007 um 16:15 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.11.2007, 17:09 Uhr
lordhelmchen



Mein Problem war dass der devc++ immer die compilermeldung brachte:
...keine passende Funktion für XY::XY(XY) vorhanden, beste Übereinstimmung ist XY::XY(&XY)....

wenn ich folgendes in der main versuchte:
XY a,b;
a=b.teilmenge();

Die Methode XY.teilmenge() hat als Rückgabetyp XY.

Die Fehlermeldung deutet nicht unmittelbar auf den tatsächlichen Fehler hin. Stimmt schon. Aber sonst könnte ja jeder C++ programmieren :-)
Ich hab dann alles referenziert und de-referenziert was nicht bei 3 auf den Bäumen war. Tatsächlich hat aber nur ein kleines "const" gefehlt.
Es geht aber tatsächlich nicht ohne konstante Referenz im devc++. Ich habe schon alle devc++-Compileroptionen durchsucht. Da kann man aber, anders wie im Borland, nicht wirklich viel einstellen. Der MinGWCompiler im devc++ hält sich default einfach an die Standards. Man könnte dem Compileraufruf zwar ein paar Optionen von Hand mitschicken, aber im Prinzip ist mir das so lieber. Der Borland ist default glaub ich noch auf C89 eingestellt. Globaler namensraum, void main(void), alte c-Header und eben die Sache mit den konstanten Referenzen stören den nicht. C++ ist nunmal leider nicht gleich C++ oder: (C++ != C++)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.11.2007, 19:18 Uhr
stephanw
localhorst


Ok.
Was mich wundert ist, dass er überhaupt den Copy-Ctor rufen will. Mir ist nur bekannt, dass wie im folgenden Beispiel die Zuweisung an "b" durch einen Aufruf des Copy-Konstruktors ersetzt werden darf.

C++:
XY a;
XY b = a; // darf zu XY b(a) gemacht werden


In Deinem Beispiel werden a und b jedoch vorher per Standard-Konstruktor angelegt und danach an a zugewiesen. Dass das auch optimiert werden darf, mag so sein. Wieder was gelernt.
Das vorrausgesetzt, ist die Beschwerde richtig. Wenn die Funktion teilmengebilden() ein Objekt per Kopie zurückgibt (keine Referenz), dann ist dies ein temporäres Objekt innerhalb dieses Ausdrucks. Und das darf nicht per Referenz, sondern nur als konstante Referenz an Funktionen weitergegeben werden (hier der Copy-Ctor), da dieses temporäre Objekt von der Funktion ja nicht geändert werden kann/darf.
--
Reden ist Schweigen und Silber ist Gold.

Dieser Post wurde am 15.11.2007 um 19:20 Uhr von stephanw editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.11.2007, 10:48 Uhr
lordhelmchen



Die Funktion teilmengenbilden() gibt auf jeden Fall eine Kopie des Objekts aus. Eine Referenz wäre nicht möglich weil die in der Funktion erstellte (temporäre) Instanz nur von begrenzter Lebensdauer ist. Eine Referenz auf ein in einer Funktion instanziertes Objekt läuft nach Beendigung der Funktion ins Nirvana. So hab ichs zumindest mal gelernt.
Problem ist auf jeden Fall gelöst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: