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
}
충돌이 발생하여 알 수 없습니다.
편집 : 올바르게 기본값 구현은
부분적으로 문제를 해결했다. 이제 qobject_cast
이 충돌합니다. 이 같은
코드의 compileable 평화를 얻을 것이 좋을 것이다. 코드를 확인하려면 필요없는 모든 것을 제거해야합니다. Q .... – Klaus
크래시가 발생하면 디버거를 사용하여 작동중인 크래시를 잡아 내고 코드에서 발생하는 위치를 찾으십시오. 그리고 당신이 생성자에게 넘겨주는'widget' 객체가 lambda가 호출 될 때까지 살아 있는지 확인하십시오. 물론 null 포인터가 아닙니다. 그리고 만약'if' 조건이 사실이 아니라면 어떨까요? 어떻게 처리할까요? –
기본 구현 (코드 예제에서 누락되었습니다)을 추가하고 포인터에 대한 검사를 추가했습니다. qobject_cast에서 여전히 충돌이 발생합니다. –