2017-02-07 3 views
1

Es könnte eine doppelte Frage sein, aber ich konnte es nicht finden, wahrscheinlich aufgrund der wahrscheinlich fehlenden Terminologie.zuweisen Lambda zu einer Variablen und rufen Sie es später

Hier ist das Problem: Ich möchte eine Lambda-Funktion einer Variablen zuweisen, die später aufgerufen werden würde.

class MyClass 
{ 
    public: 
    MyClass(QWdiget* widget); 

    void doSomething(); 

    private: 
    QWidget* my_widget; 
    std::function<QString()> my_text; 
} 

MyClass::MyClass(QWdiget* widget) 
    : my_text([=](){return QString();}) 
{ 
    if (qobject_cast<QLabel*>(widget)) 
    { 
    my_text = [=](){return my_widget ? qobject_cast<QLabel*>(my_widget)->text() : Qstring(); }; 
    } 
    else if (qobject_cast<QGroupBox*>(widget)) 
    { 
    my_text = [=](){return my_widget ? qobject_cast<QGroupBox*>(my_widget)->title() : QString(); }; 
    } 
    else 
    { 
    return; 
    } 
    my_widget = widget; 
} 

MyClass::DoSomething() 
{ 
    QString str = my_text(); 
    ....whatever 
} 

Ich bekomme einen Absturz und kann nicht herausfinden.

Edit:

korrekt den Standardwert Implementierung gelöst teilweise das Problem. Jetzt stürzt qobject_cast ab.

+0

Wäre schön, einen compiliert Frieden von Code zu erhalten. Wenn ich Ihren Code überprüfen möchte, muss ich alle nicht benötigten Dinge entfernen, z. Q .... – Klaus

+0

Wenn Sie einen Absturz bekommen, schlage ich vor, starten Sie mit einem Debugger, um den Absturz in Aktion zu fangen, und lokalisieren Sie, wo es in Ihrem Code passiert. Und stellen Sie sicher, dass das 'widget'-Objekt, das Sie an den Konstruktor übergeben, am Leben bleibt, bis das Lambda aufgerufen wurde. Und ist natürlich kein Nullzeiger. Und wenn keine der "if" Bedingungen wahr ist? Wie gehst du damit um? –

+0

Ich fügte die Standardimplementierung hinzu (fehlte im Codebeispiel) und fügte dem Zeiger eine Überprüfung hinzu. Immer noch der Absturz in qobject_cast. –

Antwort

3

Add Standardimplementierung wie folgt aus:

if (qobject_cast<QLabel*>(widget)) 
{ 
    my_text = [=](){return qobject_cast<QLabel*>(my_wdiget)->text(); }; 
} 
else if (qobject_cast<QGroupBox*>(widget)) 
{ 
    my_text = [=](){return qobject_cast<QGroupBox*>(my_wdiget)->title(); }; 
} 
else 
{ 
    my_text = [=](){ return QString(); }; 
} 
+0

Standardimplementierung war dort aber unvollständig. Es brachte mich ein bisschen weiter und aktualisierte den ursprünglichen Beitrag –

Verwandte Themen