以下是个视图切换的函数
void CMainFrame::SwitchToForm(int nForm)
{ CView *pOldActiveView=GetActiveView();
CView *pNewActiveView=(CView*)GetDlgItem(nForm); if(pNewActiveView==NULL)
{
if(nForm==IDD_LIBRARY_FORM)
{
pNewActiveView=(CView*)new CLibraryView;
}
if(nForm==IDD_BOOKINFO_FORM)
{
pNewActiveView=(CView*)new CBookInfoView;
}
if(nForm==IDD_PROVIDER_FORM)
{
pNewActiveView=(CView*)new CProviderView;
} CCreateContext context;
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL,NULL,0L,CFrameWnd::rectDefault,this,nForm,&context);
pNewActiveView->OnInitialUpdate();
} SetActiveView(pNewActiveView);
pNewActiveView->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE); int ID; if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CLibraryView))
ID=IDD_LIBRARY_FORM;
if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CBookInfoView))
ID=IDD_BOOKINFO_FORM;
if(pOldActiveView->GetRuntimeClass()==RUNTIME_CLASS(CProviderView))
ID=IDD_PROVIDER_FORM; pOldActiveView->SetDlgCtrlID(ID);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST); RecalcLayout();}
但是有以下错误
d:\work\library\libraryview.h(29) : error C2143: syntax error : missing ';' before '*'
d:\work\library\libraryview.h(29) : error C2501: 'CLibraryDoc' : missing storage-class or type specifiers
d:\work\library\libraryview.h(29) : error C2501: 'GetDocument' : missing storage-class or type specifiers
D:\work\Library\MainFrm.cpp(122) : error C2248: 'CLibraryView::CLibraryView' : cannot access protected member declared in class 'CLibraryView'
        d:\work\library\libraryview.h(17) : see declaration of 'CLibraryView::CLibraryView'
D:\work\Library\MainFrm.cpp(126) : error C2248: 'CBookInfoView::CBookInfoView' : cannot access protected member declared in class 'CBookInfoView'
        d:\work\library\bookinfoview.h(18) : see declaration of 'CBookInfoView::CBookInfoView'
D:\work\Library\MainFrm.cpp(130) : error C2248: 'CProviderView::CProviderView' : cannot access protected member declared in class 'CProviderView'
        d:\work\library\providerview.h(18) : see declaration of 'CProviderView::CProviderView'
CLibraryView是由Wizard生成
其余几个视图是自定义的
各位感兴趣的分析一下错误原因,不胜感谢!

解决方案 »

  1.   

    "cannot access protected member declared in class 'CLibraryView'"
    检查一下你那几个View的构造函数,改成public的
      

  2.   

    出现了个奇怪的现象:
          之前有那么多错
            我突发奇想把CLibrary的GetDocument()注释掉,出错很正常
         但是我在把注释去掉,奇迹出现了,错误没有了
           谁能解释一下这个现象
      

  3.   

    D:\work\Library\MainFrm.cpp(122) : error C2248: 'CLibraryView::CLibraryView' : cannot access protected member declared in class 'CLibraryView'
            d:\work\library\libraryview.h(17) : see declaration of 'CLibraryView::CLibraryView'
    D:\work\Library\MainFrm.cpp(126) : error C2248: 'CBookInfoView::CBookInfoView' : cannot access protected member declared in class 'CBookInfoView'
            d:\work\library\bookinfoview.h(18) : see declaration of 'CBookInfoView::CBookInfoView'
    D:\work\Library\MainFrm.cpp(130) : error C2248: 'CProviderView::CProviderView' : cannot access protected member declared in class 'CProviderView'
            d:\work\library\providerview.h(18) : see declaration of 'CProviderView::CProviderView'默认的CVIEW的构造函数是PROTECTED的,改成PUBLIC
    d:\work\library\libraryview.h(29) : error C2143: syntax error : missing ';' before '*'
    d:\work\library\libraryview.h(29) : error C2501: 'CLibraryDoc' : missing storage-class or type specifiers
    d:\work\library\libraryview.h(29) : error C2501: 'GetDocument' : missing storage-class or type specifiers看看你是否重复包含了头文件,比如,CLibraryDoc.h里包含了CLibrayView.h而且CLibrayView.h又包含了CLibraryDoc.h
      

  4.   

    先把那几个View的默认构造函数改成PUBLIC
      

  5.   

    注掉之前调用的是CLibrary类的GetDocument()函数,注掉之后调用的是父类的GetDocument()函数,检查一下你的CLibrary类的GetDocument()函数,看看有什么问题。