Methode aus anderer Klasse aufrufen

Du bist neu in der Welt von C++? Dann schau hier herein!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Sry, klingt jetzt hart, aber nicht verzweifeln...

BITTE leg alles was mit GUI und Qt zu tun hat bei Seite und beschäftige dich die nächsten Wochen/Monate mit C++ (Grundlagen, STL, vllt. auch bissl Design Pattern wenn der Rest sitzt)...

Warum?

1) QWidget* widget = new Widget;
erzeugt ein QWidget im Freispeicher
QWidget widget;
erzeugt eines im automatischen Speicher ("STACK").
Im ersten Fall bist du für Speicherbereinigung zuständig, im zweiten geschieht dies automatisch.

2) Speicher freigeben machst du als Anfänger NIE mit dem direkten Aufruf des Destruktors, sondern mit delete! dlg->~Dialog() in deinem Beispiel führt zwar den Code im Destruktor aus, gibt aber dann den Speicher nicht frei -> Memory Leak!

3) Dereferenzieren von Pointern mit operator* ist natürlich eine schöne Sache. Aber per Default (weils einfacher und übersichtlicher ist) nimmst du dafür operator->

Code: Alles auswählen

QWidget* w = new QWidget;
w->show();
4) Sichtbarkeit/Scope
Wenn du dlg als Member in deiner Klasse ablegst, können alle Methoden und je nach Sichtbarkeit/friends auch andere Klassen auf das Objekt zugreifen. Das wirst du aber nicht wollen.
Sichbarkeit so gering als möglich, sprich in deinem Fall Funktionslokal, dann wird das Objekt am Ende auch brav zerstört, wenn du es im automatischen Speicherbereich ablegst:

Code: Alles auswählen

void MainWindow::on_action_showDialog() {
    Dialog dlg;
    if( dlg.exec() == QDialog::Accepted ) { 
        Arbeiten();
    }
} // hier ist jetzt dlg automatisch gelöscht, Speicher bereinigt, niemand kann mehr darauf zugreifen
5) So wenig wie möglich mit "new" arbeiten. Google mal nach RAII.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

das ist gut, dass du das sagst: ich hab mich shon gewundert, warum ich so viel Arbeitsspeicher, wie die großen Programme verbrauche. (xd) Ich versuch dann mal alle new zu ersetzen.
Bei meinen Beispiel möchte ich ja ein tabDialog machen
und wenn ich den so deklarieren möchte
tabDialog dlg;
muss ich den ja vorher im header deklarieren.

und meine normalen Widget sind ja dort so geschrieben:
QWidget *Q;
QWidget *Q2;

aber ich kann da nicht
tabDialog *dlg;
einfügen, da es ja mein eigenes Widget ist
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Doch du kannst

Code: Alles auswählen

tabDialog *dlg; 
jederzeit einfügen. Aber bitte beschäftige dich jetzt erst mal mit C++-Grundlagen.
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ok das passt nun habs raus gefunden, aber mein Programm stürtzt bei dem Dialog ab. xD
Mein Code:

Code: Alles auswählen

Dialog::Dialog(int rNu)
{

    switch(rNu)
    {
        case 2:
            QLabel *label;
            label->setText("Hello");
            QLineEdit *lineEdit;
            label->setBuddy(lineEdit);

            QPushButton *createButton;
            QPushButton *closeButton;

            connect(createButton, SIGNAL(clicked()), this, SIGNAL(accepted()));
            connect(closeButton, SIGNAL(clicked()), this, SLOT(reject()));

            QHBoxLayout *hlayout;
            hlayout->addWidget(createButton);
            hlayout->addWidget(closeButton);

            QVBoxLayout *vlayout;
            vlayout->addWidget(label);
            vlayout->addWidget(lineEdit);
            vlayout->addLayout(hlayout);

            this->setWindowTitle(Hello Dialog");
            this->setFixedSize(250,100);

            this->setLayout(vlayout);
            this->exec();
            break;
    }
}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Absturz heißt für dich Debuggen...
Ansonsten solltest du endlich das Qt-Buch beiseite legen und eines über C++ lesen!
Der "C++ Primer" von Stanley Lippman soll eine wunderbare kompetente Einführung in C++ sein. Wenn du dann noch mehr wissen willst kauf dir den Struppi.
Wenn es dir dann immer noch nicht reichen sollte (Achtung, Lektüre für in 2-3 Jahren!) die Effective C++-Reihe von Scott Meyers sowie Exceptional C++ von Herb Sutter (letztere am besten im Original auf Englisch).

Nimm die Hinweise ernst. Das was du in diesem Thread verbrochen hast geht auf keine Kuhhaut :D Auch der Code den du glücklicherweise nochmal gelöscht hast - Mannmannmann.

Ich mach mal dicht hier, geht schon seit einiger Zeit voll am Thema vorbei, und ich fürchte dass noch mehr kommen würde...
Gesperrt