2017-02-07 1 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 
} 

충돌이 발생하여 알 수 없습니다.

편집 : 올바르게 기본값 구현은

부분적으로 문제를 해결했다. 이제 qobject_cast이 충돌합니다. 이 같은

+0

코드의 compileable 평화를 얻을 것이 좋을 것이다. 코드를 확인하려면 필요없는 모든 것을 제거해야합니다. Q .... – Klaus

+0

크래시가 발생하면 디버거를 사용하여 작동중인 크래시를 잡아 내고 코드에서 발생하는 위치를 찾으십시오. 그리고 당신이 생성자에게 넘겨주는'widget' 객체가 lambda가 호출 될 때까지 살아 있는지 확인하십시오. 물론 null 포인터가 아닙니다. 그리고 만약'if' 조건이 사실이 아니라면 어떨까요? 어떻게 처리할까요? –

+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

기본 구현이 있지만 불완전합니다. 그것은 나에게 조금 더 가져 왔고, 원래 게시물을 업데이트했다. –

관련 문제