2009-08-14 3 views
0

앞으로 선언문을 가져 오는 데 문제가 있습니다 (의도 한대로 작동해야하는지 잘 모르겠습니다).전달 선언 문제

나는 다음과 같이 CPP 파일이 :

int DialogModeless::Create(int dialogID, Presenter* pPresenter) 
{ 
    Ptrs* pPtrs = new Ptrs; 
    pPtrs->pPresenter = pPresenter; 
    pPtrs->pWnd = _derived; 
    HINSTANCE hInstance = ::GetModuleHandle(NULL); 
    _hWnd = ::CreateDialogParam(hInstance, MAKEINTRESOURCE(dialogID), NULL, &Presenter::StatDlgProc, 
     reinterpret_cast<LPARAM>(pPtrs)); 
    return 0; 
} 

지금은 그것이 내가에만 주소를 복용하고 있기 때문에 발표자 :: StatDlgProc는이 시점에서 선언 할 필요가 있다는 것입니다있는 방법입니다. 이것은 내가 비주얼 스튜디오 2008에서 다음과 같은 오류가 점점 오전 같은 경우 될 것 같지 않습니다 :

오류 C2027 : 정의되지 않은 유형의 사용 '발표자'

내가 코드를 컴파일하는 Presenter.h을 포함해야

.

누구든지 내게 설명 할 수 있습니까?

나는 다음과 같이 선언 전달하려고 :

class Presenter; 
BOOL CALLBACK Presenter::StatDlgProc(HWND, UINT, WPARAM, LPARAM); 
+0

그래서 어떻게'StatDlgProc'을 어떻게 선언합니까? 코드를 보여주십시오. –

답변

0

당신은 이런 식으로, (당신의 CPP 파일에 예) 클래스뿐만 아니라 함수를 선언해야합니다 :

class Presenter; 

이것은 Presenter가 클래스라는 것을 컴파일러에 알려주므로이를 다루는 방법을 대략 알고 있습니다.

하지만 두 개의 헤더 사이에 순환 종속성과 같은 좋은 이유가 없다면 # 적절한 헤더를 포함하는 것이 좋습니다.

+0

글쎄, 나는 너가 일반적으로보다는이 특정한 상황에 포함시키는 것이 최선이라고 말하고 싶다. 그리고 내가 아는 제이슨 윌리엄스인가? – Goz

+0

옙 and yep :-) –

5

Presenter의 클래스 정의없이 컴파일러는 Presenter::StatDlgProc의 주소를 가져 오는 방법을 사용하지 않습니다. 특히 가상인지 여부는 알 수 없습니다. 그것이 가상의 경우 함수 호출을 찾을 코드를 생성하기 위해 클래스의 vtable 레이아웃을 알아야합니다. 정적 인 경우 컴파일러는 이론적으로 링크 타임에 주소를 확인할 수 있습니다. 따라서 클래스 정의가 없으면 간단한 컴파일러는 간단한 함수 호출 또는 가상 함수 조회에 대한 명령어를 내보낼 지 여부를 결정할 수 없습니다. 제이슨로

class Presenter; 

제안 또는 이렇게처럼 만들 선언 :

+0

포워드 declation 만 사용하여 전역 범위에서 비 클래스 함수의 주소를 가져올 수 있습니까? –

+0

처럼 :'void func (int parm); funcPtr = &func;'가능합니다. 링커가 해결할 수 있습니다. – AShelly

0

당신은 앞으로 두하여 발표자 클래스를 선언하면

int DialogModeless::Create(int dialogID, class Presenter* pPresenter); 

하지만 전체 선언을 포함하지 않고 방법으로이 없다 가상 또는 회원 여부에 관계없이 모든 구성원에 액세스하십시오.

이제 헤더 파일을 쉽게 구성 할 수 있습니다. modelessdialog.cpp는 presenter.h에 의존하지만 modelessdialog.h는 그렇게하지 않으므로 헤더 파일간에 어려운 상호 작용이 없습니다.

관련 문제