Возможно, это дубликат вопроса, но я не мог его найти, возможно, из-за недостатка терминологии.назначьте лямбду переменной и назовите ее позже.
Вот проблема: я хотел бы присвоить лямбда-функцию переменной, которая будет вызываться позже.
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
аварии.
Было бы неплохо, чтобы получить compileable мир кода. Если я хочу проверить ваш код, я должен удалить все ненужные вещи, например. Q .... – Klaus
Если вы получаете сбой, я предлагаю вам начать с использования отладчика, чтобы поймать крах в действии и найти, где это происходит в вашем коде. И убедитесь, что объект 'widget', который вы передаете конструктору, остается в живых до тех пор, пока не будет вызвана лямбда. И, конечно, не является нулевым указателем. И что, если ни одно из условий «если» не верно? Как вы справитесь с этим? –
Я добавил реализацию по умолчанию (отсутствовал в примере кода) и добавил проверку на указатель. По-прежнему происходит сбой в qobject_cast. –