Fehler: Kein Kopierkonstruktor verfügbar --> :-(
-
Hallo,
ich habe in mein Pgm eine Klasse erstellt, die ich in anderen Klassen verwende, jedoch nachdem ich getter und setter-Methoden für das Objekt in anderen Klassen definiere, kommt die Fehlermeldung u.a. Kein Kopierkonstruktor vorhanden...wenn das Objekt von der erstellten 1. Klasse abgefragt wird
...so das war die kurze Form, detailliert sieht es so aus...ich hab die Klasse...
class CDBAnbindung : public CRecordset { public: CDBAnbindung(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CDBAnbindung) ...
...die ich neu erstellt habe, diese Klasse ist dafür verantwortlich, um eine Verbindung zu einer SQL-Datenbank aufzubauen...
...in der Klasse...
class CMenue : public CDialog { // Konstruktion public: CMenue(CWnd* pParent = NULL); // Standardkonstruktor CMenue(CString* ,CString* ,CString* ,CString* ,CString*, CString*, long, long, long, long, CString, int, CString, CString, CString, CString, CString, CString, CString, CWnd* pParent); CMenue(ISaGsaRpConnection rPConnection, CDBAnbindung dBConnection, CWnd* pParent); // Konstruktor mit Connect-Objekt ISaGsaRpConnection GetRpConnectionObject(); void SetRpConnectionObject(ISaGsaRpConnection rPObject); CDBAnbindung GetDBConnectionObject(); void SetDBConnectionObject(CDBAnbindung dBObject); ... protected: CDBAnbindung dBConnection; ...
...habe ich Getter- und Setter-Methoden definiert, wie man auch sehen kann, weiterhin habe ich auch ein Objekt der Klasse CDBAnbindung in dem Header implementiert...
...jedoch, wenn ich jetzt die Klasse kompiliere, kommen diese Fehlermeldungen
C:\apps\API\Menue.cpp(191) : error C2582: Die Funktion für Operator 'static_cast' ist in '<unbekannt>' nicht verfügbar
C:\apps\API\Menue.cpp(196) : error C2558: class 'CDBAnbindung' : Kein Kopierkonstruktor verfuegbar...und zwar an diesen Stellen...
void CMenue::SetDBConnectionObject(CDBAnbindung dbObject) { dBConnection = dbObject; //Fehlermeldung 1 } CDBAnbindung CMenue::GetDBConnectionObject() { return dBConnection; //Fehlermeldung 2 }
weiss einer Rat für mich, warum das so ist...
Gruss,
chullain
-
Er sagt es dir doch schon: Du brauchst noch einen Copy-Construktor.
CDBAnbindung::CDBAnbindung(CDBAnbindung& dbAnbindung)
{...}
Am besten ist du macht auch gleich noch einen operator=, den kannst du dann im Copyconstruktor benutzen...
-
Danke erstmal auf jeden Fall...
Ich hab jetzt mal einen Copy-Konstruktor angelegt... und der zweite Fehler verschwindet, obwohl ich das jetzt nicht so ganz gerafft habe, warum er jetzt einen Konstruktor mit Parameterübergabe aufruft, obwohl ich doch keine Parameter an die Klasse übergeben habe...auf jeden Fall funzt...
...aber was mich halt noch stört ist der erste Fehler
C:\apps\API\Menue.cpp(191) : error C2582: Die Funktion für Operator 'static_cast' ist in '<unbekannt>' nicht verfügbar
...das habe ich nicht so ganz verstanden, was Du mit einem Operator in dem Copy-Konstruktor anlegen, meinst...
-
Hast du ein Grundlagenbuch C++? Da steht das alles drin.
Okay, ich versuche es kurz zu erklären, bin heute etwas unter Zeitdruck...
CDBAnbindung& CDBAnbindung::operator=( const CDBAnbindung& dbAnbindung) { if (this != &dbAnbindung) // Keine Selbstzuweisung { m_inhalt = dbAnbindung.m_inhalt; // Member kopieren } return *this; // Rückgabe }
CDBAnbindung::CDBAnbindung( const CDBAnbindung& dbAnbindung) { this = dbAnbindung; // Hier kannst du den operator= benutzen, sonst musst du es doppelt tippen. }
Jetzt besser?
-
ja, ok, vielen Dank schon mal...verstanden hab ich es, aber er bringt jetzt folgende Fehlermeldung, wenn ich den operator = in der Klasse CDBAnbindung deklariere...
:\apps\API\DBAnbindung.cpp(72) : error C2511: 'class CDBAnbindung &__thiscall CDBAnbindung::operator =(const class CDBAnbindung &)' : Überladene Member-Funktion nicht in '<unbekannt>' gefunden
den operator habe ich so deklariert
CDBAnbindung operator=(CDBAnbindung& dbAnbindung);
CDBAnbindung& CDBAnbindung::operator =(CDBAnbindung& dbAnbindung) { return *this }
...wenn ich es so deklariere, wie Du es gemacht hast, dann kommt die Fehlermeldung...
error C2556: 'class CDBAnbindung &__thiscall CDBAnbindung::operator =(const class CDBAnbindung &)' : Überladene Funktion unterscheidet sich nur hinsichtlich des Rückgabetyps von 'class CDBAnbindung __thiscall CDBAnbindung::operator =(const class CDBAnbindung &)'
-
Du hast ein & vergessen.
Es muss auf jeden Fall in Header und Cpp gleich aussehen, das tut es nicht - schau:
CDBAnbindung operator =(CDBAnbindung& dbAnbindung); CDBAnbindung& CDBAnbindung::operator =(CDBAnbindung& dbAnbindung)
mit dem const sollte es so gehen:
CDBAnbindung& operator =(const CDBAnbindung& dbAnbindung); CDBAnbindung& CDBAnbindung::operator =(const CDBAnbindung& dbAnbindung)
-
oh wie dämlich, danke...
vielleicht hast Du ja noch ne Antwort auf dieses Problem...
er zeigt jedes Mal ne Fehlermeldung an , wo ich ein Objekt dieser Klasse erstelle
CDBAnbindung dBConnection;
...obwohl ich ja eigentlich die Klasse "included" habe...
die Fehlermeldung wäre ja dann...
error C2501: 'CDBAnbindung' : Fehlende Speicherklasse oder Typspezifizierer
-
ist ok, habs raugefunden...er verlangt in jeder von mir erstellten Klasse ein Include dieser Klasse, obwohl diese Klasse in den anderen Klassen garnicht benutzt wird...
...oder ist es möglich, dass meine "oberste" Klasse,(keine Basisklasse jetzt, nicht verwechseln, sondern nur mein "Hauptmenü") nennen wir sie CMenue, die Klasse CDBAnbindung "included" hat, und die Klasse CMenue andere Klassen aufruft, die darauf hin, ein include der Klasse CDBAnbindung verlangen?
Gruss,
chullain