2017-01-10 2 views
0

컨테이너 객체 중 하나에서 Bind()를받을 가능성이있는 wxWindow 파생 객체를 파괴하려고합니다. 내 독서 (그리고 일부 이전의 경험 이상한 오류를 쫓는)을 기반으로, 나는 이벤트 대기열을 다 써버 때까지 Destroy()에 대한 호출을 지연해야한다고 생각, 그렇지 않으면 이벤트 처리기가 파괴 된 목적.CallAfter를 사용하여 wxWindow :: Destroy를 호출하면 컴파일 타임 오류가 발생합니다.

내가 읽었던 것은 CallAfter()를 사용하여 객체의 Destroy() 함수를 실행한다고 말합니다. 나는 wxAsyncMethodCallEventFunctor를 가리키는 : WX/event.h에서() 함수를 실행, 내가 컴파일 오류 "C2064 기간이 0 인수를 복용 함수에 평가하지 않습니다"얻을

obj->CallAfter(&ObjClass::Destroy); 

를 호출 할 경우 문제가된다. 이것은 wxWindow :: Destroy()가 인자를 취하지 않는다면 주어진 이상한 것처럼 보입니다. 인스턴스 참조 ("obj")가 문제라고 생각했지만, 다른 방법으로 호출하려고했을 때 너무 많은 매개 변수가 있다고 말하는 오류가 발생했습니다.

일부 실험에서는 파생 된 객체에서 0 개의 인수를 취하는 함수를 정의하여 작동하도록 만들었습니다. (분명히 비판적으로) 은 bool보다는 void를 반환합니다.이처럼 매우 보인다 : 나는 표현을

obj->CallAfter(&ObjClass::DestroyMe); 

프로그램을 컴파일하고 작동하는 표시를 사용할 때 이제

void ObjClass::DestroyMe() 
{ 
    this->Destroy(); 
} 

. 아직도, 나는 그것이 klunky 느낌 때문에이 솔루션을 싫어.

  • 더 좋은 방법이 있나요?

  • 문제가 bool 대 void 반환 값과 관련이 있다고 생각하는 것이 맞습니까?

    • 그렇다면, 어떻게 든 (필자는 부울 값 걱정하지 않기 때문에)는 무효() 함수 호출을 시뮬레이션 할 수있는 함수 참조를 캐스트 할 수 있습니까?
+0

왜 윈도우를 닫기 전에 모든 핸들러를 unbind()하지 않거나 윈도우 소멸자에서 더 나은가? – Igor

+0

나는 이벤트 테이블을 조사하여 바인딩이 어떤 경우에 있었는지 파악했습니다. 이미 구축 한 것보다 더 많은 코드를 확실히 가져옵니다. 내 목표는 복잡성을 줄이는 것입니다. – TPDMarchHare

답변

1

CallAfter() 예상 않는 void 호출은 아무것도했다 다음 (그것과 다른 무엇을 할 수 있기 때문에?) 바로 결과를 폐기하는 경우가 Destroy()을 전달할 수 있도록 그것은 위험 할 것 때문에 직접.

귀하의 해결 방법은 그래서 일반적으로 그냥 쓰는 것, 당신이 CallAfter() 아주 잘 갈 람다를 사용하여 훨씬 짧고 더 편리 할 수 ​​있습니다 C++ 11 물론 괜찮지 만

obj->CallAfter([=]() { this->Destroy(); }); 
+0

감사합니다. 나는 정말로해야 할 일은 람다를 배우는 것이라고 생각합니다. 나는 그들을 사용하지 못했습니다 (내가 C++을 배웠을 때 존재하지 않았다는 것을 알고있는 한). 그리고 지금까지는 그것을 이해할 필요가 전혀 없었습니다. – TPDMarchHare