2017-02-07 4 views
1

Возможно, это дубликат вопроса, но я не мог его найти, возможно, из-за недостатка терминологии.назначьте лямбду переменной и назовите ее позже.

Вот проблема: я хотел бы присвоить лямбда-функцию переменной, которая будет вызываться позже.

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 
} 

Я получаю сбой и не могу узнать.

Edit:

Реализация правильно значение по умолчанию частично решить эту проблему. Теперь, qobject_cast аварии.

+0

Было бы неплохо, чтобы получить compileable мир кода. Если я хочу проверить ваш код, я должен удалить все ненужные вещи, например. Q .... – Klaus

+0

Если вы получаете сбой, я предлагаю вам начать с использования отладчика, чтобы поймать крах в действии и найти, где это происходит в вашем коде. И убедитесь, что объект 'widget', который вы передаете конструктору, остается в живых до тех пор, пока не будет вызвана лямбда. И, конечно, не является нулевым указателем. И что, если ни одно из условий «если» не верно? Как вы справитесь с этим? –

+0

Я добавил реализацию по умолчанию (отсутствовал в примере кода) и добавил проверку на указатель. По-прежнему происходит сбой в qobject_cast. –

ответ

3

реализация Добавить по умолчанию, как это:

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

по умолчанию осуществление был, но неполный. Это принесло мне немного больше, обновив исходное сообщение –