E2328 Klassen mit Eigenschaften dürfen nicht über ihren Wert kopiert werden
-
hallo
ich versuche über den dereferenzierungs-operator (*) den speicherinhalt eines objektes, einem anderen zuzuweisen und er halte die compiler fehlermeldung wie im titel benannt. die bcb hilfe äussert:
Dieser Fehler tritt auf, wenn Sie versuchen, den Standardzuweisungoperator zu verwenden. Der folgende Code für zwei Labels auf einem Formular erzeugt beispielsweise diesen Fehler:
*Label1->Font = *Label2->Font;
wenn ich mich nicht irre, dereferenziert man mit dem verweis-operator (->) ja bereits, oder?. aber ich möchte ja das objekt ansich kopieren:
*pObj2 = *pObj1;
die klasse, die von mir selber geschrieben wurde, erbt von TRemotable. vielleicht happerts dadran? wie kann man nun am gescheitesten das lösen, was ich brauche? ich möchte eben nicht das pObj2 auf pObj1 zeigt, sondern der speicherinhalt soll eben auf den neuen speicherbereich kopiert werden.
:xmas1: :xmas1: :xmas2: :xmas2:
ich wünsche euch frohe weihnachten
:xmas2: :xmas2: :xmas1: :xmas1:
-
Wie wäre es denn mit einem ganz klassischen Kopierkonstuktor?!? Der dürfte dann genau das machen was du willst/brauchst.
//im Header class TBlubb { private: int blah; //... public: TBlubb(); TBlubb(const TBlubb &rhs); //... };
// Implementierung TBlubb::TBlubb() { blah =0; } TBlubb::TBlubb(const TBlubb &rhs) { blah = rhs.bla; }
// Benutzung TBlubb *pObj1 = new TBlubb(); //... do something TBlubb *pObj2 = new TBlubb(pObj1);
Und schon haste alle Werte die du willst in nem eigenen Speicherbereich....
Freundliche Grüsse
TFX
-
danke, das ist schon klar soweit. ich dachte nur warum es nicht auch normal geht und warum es bei der VCL scheinbar diese einschränkung gibt?
-
komisch. ich bekomme nun:
[C++ Fehler] file.cpp(58): E2285 Keine Übereinstimmung für 'MyClass::MyClass(MyClass *)' gefunden
class MyClass : public TRemotable { public: __fastcall MyClass(void); __fastcall MyClass(const MyClass &pMyClass); __fastcall ~MyClass(void); }; ......... __fastcall MyClass::MyClass(void) { } __fastcall MyClass::MyClass(const MyClass &pMyClass) { } ......... this->pMyClass = new MyClass(pMyClass);
-
ach ich glaube es liegt daran das pMyClass einen defult wert (NULL) hat und referenzen müssen ja gültig sein. habe den konstruktor parameter nun als zeiger deklariert.
-
komisch. warum funktioniert folgendes?
__fastcall MyClass(const MyClass *pMyClass); this->pMyClass = new MyClass(*pMyClass);
es wird doch ein zeiger auf MyClass erwartet und nicht der inhalt! verstehe ich jetzt absolut nicht warum das compilierbar ist.
-
Das funktioniert, weil ein Copykonstruktor für deine Klasse existiert. Entweder hast du selber einen erstellt oder du hast den Default-CopyCtor.
Das hier__fastcall MyClass(const MyClass *pMyClass);
ist jedenfalls keiner.
-
huh!? schrieb:
danke, das ist schon klar soweit. ich dachte nur warum es nicht auch normal geht und warum es bei der VCL scheinbar diese einschränkung gibt?
Weshalb und inwiefern der BCC Delphi-Klassen anders behandelt als gewöhnliche Klassen, habe ich hier erläutert.
Ursache deiner Fehlermeldung ist, daß der Compiler für Klassen, die Eigenschaften besitzen, den Zuweisungsoperator nicht implizit erstellt, da eine einfache Zuweisung für Eigenschaften etwas problematisch sein kann. Wenn du den Zuweisungsoperator manuell überlädst, kannst du auch eine solche Zuweisung durchführen, ohne daß der Compiler sich beklagt.
Damit hätte ich schon zwei Punkte, die ich in obigem Artikel nachtragen muß (Überladen des globalen oder klassenspezifischen operator new und der implizite Zuweisungs-Operator).
Fällt noch jemandem etwas ein?