Seite 1 von 1
copy constructor
Verfasst: 27. April 2006 16:23
von medi
Hallo Leute!
Könnte mir jemand bitte sagen wo ich ein Beispiel finde für die Definition eines Kopierkonstruktors für eine Klasse welche z.B. von QWidget abgeleitet wurde?
Ich habe schon einiges versucht und auch die Threads hier zu dem Thema gelesen...
Beim Kompilieren erhalte ich folgende Fehlermeldungen:
QWidget& QWidget::operator=(const QWidget&)’ is private
Vermutlich weil die Klasse für die ich den Konstruktor schreibe von QWidget abgeleitet ist.
Dann erhalte ich noch folgende Warnung:
class QWidget’ should be explicitly initialized in the copy constructor
Code: Alles auswählen
PWindow::PWindow(const PWindow& win_source) : QWidget(win_source)
Das funktioniert nicht. Ich habe das noch nicht verstanden.
Hintergrund ist Folgender:
Ich möchte eine Funktion schreiben, die als Rückgabewert ein Objekt der Klasse hat, die von QWidget abgeleitet ist. Dafür wird wohl der Kopierkonstruktor benötigt...
Es wäre schön, wenn Ihr mir Tips geben könntet.
Dankeschön
Verfasst: 28. April 2006 08:59
von Alci
Hi,
also wenn dein PWindow von QWidget abgeleitet ist, dann sollte das hier:
PWindow::PWindow(const PWindow& win_source) : QWidget(win_source)
schon funktionieren.
Und warum der =-Operator von QWidget private ist, kann ich mir schon vorstellen. Das ist sicherlich Absicht.
Ach ja, der Kopierkonstruktor und die Methode "operator=" ist nicht das gleiche, nur mal so zur Info.
MfG, Alci.
Verfasst: 28. April 2006 13:55
von medi
Hallo Alci,
vielen Dank für Deine Antwort. Ich habe schon wieder alles verworfen. Werde es später aber noch einmal versuchen.
QWidgets und davon abgeleitete Klassen lassen den Operator "operator=" nicht zu. Das hatte ich heute morgen im Internet irgendwo gefunden.
Danke nochmal und ein schönes Wochenende.
Tschau Annett
Verfasst: 19. Februar 2008 14:40
von Allroad
Das Problem mit dem Kopierkonstruktor habe ich auch... was mache ich falsch?
meine Klasse abgeleitet von QWidget:
Code: Alles auswählen
//.h-File
class ClassCB : public QWidget, public Generator
{
Q_OBJECT
public:
ClassCB(QWidget *parent = 0);
ClassCB(const ClassCB&); //das hier soll mein Copy-Ctor sein...
....
}
und der Konstruktor soll nichts tun...:
Code: Alles auswählen
//.cpp-File
ClassCB::ClassCB(const ClassCB& cbclass)
:QWidget(cbclass)
{
}
nun die Fehlermeldung:
Code: Alles auswählen
src/classCB.h: In member function ‘ClassCB& ClassCB::operator=(const ClassCB&)’:
src/classCB.h:17: instantiated from ‘void QList<T>::node_construct(QList<T>::Node*, const T&) [with T = ClassCB]’
/usr/local/Trolltech/Qt-4.3.0rc1/include/QtCore/qlist.h:424: instantiated from ‘void QList<T>::insert(int, const T&) [with T = ClassCB]’
src/worksheet.cpp:117: instantiated from here
/usr/local/Trolltech/Qt-4.3.0rc1/include/QtGui/qwidget.h:701: error: ‘QWidget& QWidget::operator=(const QWidget&)’ is private
Danke..!
Verfasst: 19. Februar 2008 15:14
von upsala
Dann darfst du nicht, von QWidget ableiten, QWidget läßt (sinnvollerweise) keinen Kopierkonstruktor zu, aber das stand weiter oben im Thread auch schon.
Verfasst: 19. Februar 2008 15:25
von Christian81
Nicht nur QWidget sondern alle von QObject abgeleiteten Klassen können nicht kopiert werden.
Verfasst: 19. Februar 2008 15:26
von Allroad
ok, was soll ich dann stattdessen nehmen? ich will dass meine Klasse mit Signals&Slots arbeiten kann, dafür muss es von QObject erben...
"All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject."
Verfasst: 19. Februar 2008 15:35
von Allroad
das ist nicht gut...
meine Klasse (ClassCB : QWidget) benutze ich als Element einer Liste in einer anderen Klasse
Code: Alles auswählen
class WorkSheet : public QWidget
{
Q_OBJECT
public:
WorkSheet(QWidget *parent = 0);
private:
QList<ClassCB> ioModule; // HIER!
...
};
sobald ich in meiner Liste einfügen will wird der Kopierkonstr. benutzt...
d.h. wohl dass ich auf Signal&Slots wohl verziechten muss, oder habt ihr eine bessere Idee?
Verfasst: 19. Februar 2008 15:36
von upsala
C++-Grundlagen: Lege Zeiger ab.
Verfasst: 19. Februar 2008 15:44
von Allroad

1 Taste gedrückt (*)... schon funktionierts! Danke. Und ja, meine C++-Kenntnisse sind nicht so toll!