copy constructor

Alles rund um die Programmierung mit Qt
Antworten
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

copy constructor

Beitrag 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
Alci
Beiträge: 70
Registriert: 24. März 2006 23:34

Beitrag 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.
medi
Beiträge: 16
Registriert: 2. März 2006 13:25

Beitrag 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
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag 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..!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nicht nur QWidget sondern alle von QObject abgeleiteten Klassen können nicht kopiert werden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag 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."
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag 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?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

C++-Grundlagen: Lege Zeiger ab.

Code: Alles auswählen

QList<ClassCB*> ioModule;
Allroad
Beiträge: 61
Registriert: 23. Oktober 2007 10:19
Kontaktdaten:

Beitrag von Allroad »

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