Compiler erstellt weder Standardkonstruktor noch Zuweisungsoperator
-
Hi,
folgender Code:
class CPluginManager { class CPlugin; public: CPluginManager(CKernel &Kernel); ~CPluginManager(void); // ... private: std::vector<CPlugin> m_PluginList; }; class CPluginManager::CPlugin { public: // Zum Test alles auskommentiert! private: CKernel &m_Kernel; CString m_strFile; HMODULE m_hModule; };
Das Problem ist jetzt, dass für CPluginManager::CPlugin weder ein Standardkonstruktor erstellt wird (wenn ich z.B. m_PluginList.push_back(CPlugin()); schreibe, kommt "kein geeigneter Standardkonstruktor verfügbar) und auch kein Standardzuweisungsoperator erstellt wird!
Warum nicht?
ChrisM
-
schau dir mal an, wann ein standard Ctor,CCtor und COp generiert wird.
Nämlich nur, wenn alle Member einen standard Ctor,CCtor bzw. COp haben.
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=DefCtor1#Answ
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=DefCtor2#Answaußerdem ist CPlugin hier private!
[ Dieser Beitrag wurde am 16.04.2003 um 15:06 Uhr von kingruedi editiert. ]
-
ich vermute eher mal, dass deine deklaration "class CPlugin;" faul ist
schreib mal ein "class CPlugin {};" und es sollte funzen
-
Original erstellt von Korbinian:
ich vermute eher mal, dass deine deklaration "class CPlugin;" faul ist
schreib mal ein "class CPlugin {};" und es sollte funzennein, dass eine ist ja eine Forward Deklaration, dass andere eine Definition
-
Der Übeltäter ist:
CKernel &m_Kernel;
Referenzen müssen immer intialisiert werden und dies kann *niemals* durch eine implizit erzeugte Funktion geschehen. Für Klassen mit Referenzmember gibt es also weder einen impliziten Standard- noch Copy-Ctor. Und da niemand außer dir weiß, was mit der Referenz bei einer Zuweisung geschehen soll, wird auch kein Zuweisungsop implizit erzeugt.
-
Original erstellt von kingruedi:
nein, dass eine ist ja eine Forward Deklaration, dass andere eine Definitionda hab ich wohl nicht ganz durchgelesen...
-
Ähm, das eröffnet natürlich ein neues Problem, weil ich kann die Referenz ja nur in der Elementinitialisierungsliste setzen und nicht mehr im Zuweisungsoperator. Ich schätze, hier muss ich einen Zeiger verwenden, oder?
ChrisM
-
Hallo,
wenn sich im Laufe des Lebens des Objekts die Referenz ändern können soll, also ein anderes Objekt referenzieren können soll, dann musst du in der Tat Zeiger benutzen.
-
wenn man nicht aufpasst, kann es passieren, das 2 objekte den gleichen speicher löschen wollen. aber das weißt du sicher ChrisM
-
Ja, weiß ich, deswegen wollte ich ja ursprünglich auch Referenzen und Smart Pointer verwenden wo es geht, aber hier geht es halt nicht.
CPlugin wird aber eh net kopiert, d.h. der Operator (der jetzt auch leer implementiert ist) wird eh net aufgerufen.ChrisM