CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

为什么类的实例不能继承?

楼主xdx1024(叶坚峰)2006-03-01 15:30:41 在 VC/MFC / 基础类 提问

BaseOperation.h中包含如下语句:  
  static CJyListView* m_pListView  
  我在JYListView中,包含了BaseOperation.h头文件  
  写了如下语句:  
  CReportCtrl   *   m_rc   =   m_pListView->GetReportCtrlPtr();  
  系统报:  
  error   C2065:   'm_pListView'   :   undeclared   identifier  
  由于我是修改别人的程序,  
  static CJyListView* m_pListView  
  这句话不能修改,  
  请问这个问题如何解决。  
  另外:这是一个已有程序,m_pListView这个类实例多处正常使用,  
  我也没发现有什么特别的地方。谢谢。 问题点数:20、回复次数:9Top

1 楼wenkui(黒眼看红尘)回复于 2006-03-01 15:38:05 得分 4

在文件中加入extern   static   CJyListView* m_pListView试试Top

2 楼missle(闪人)回复于 2006-03-01 15:38:42 得分 4

楼主的题目提的也太.......  
  寒,多贴点code吧,不是很清楚,JYListView的cpp文件和头文件怎么写的.Top

3 楼missle(闪人)回复于 2006-03-01 15:39:20 得分 4

extern和static可以混用么????????Top

4 楼xdx1024(叶坚峰)回复于 2006-03-01 15:54:51 得分 0

BaseOperation.h的文件如下:  
   
  #if   !defined(AFX_BASEOPERATION_H__FFB71D45_6EA6_4152_87E5_4A6BB46AE25B__INCLUDED_)  
  #define   AFX_BASEOPERATION_H__FFB71D45_6EA6_4152_87E5_4A6BB46AE25B__INCLUDED_  
   
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  //   BaseOperation.h   :   header   file  
  //  
   
   
  class   CJyListView;  
  /////////////////////////////////////////////////////////////////////////////  
  //   CJyOperationBase   command   target  
  #define   GETITEM(iID) rvi.iItem   =   iID;m_rc->GetItem(&rvi)  
  #define   INSERTITEM(iID)   rvi.iItem   =   iID;rvi.nMask   =   RVIM_TEXT;rvi.iSubItem   =   0;rvi.lpszText   =   NULL;m_rc->InsertItem(&rvi)  
  #define   SETPARAM(iID,iParam)   m_rc->SetItemData(iID,iParam)  
  #define   SETTEXT(x,y)   rvi.nMask   =   RVIM_TEXT;rvi.iSubItem   =   x;rvi.lpszText   =   (LPTSTR)(LPCTSTR)y;m_rc->SetItem(&rvi)  
  #define   SETIMAGE(x,iImageID)   rvi.nMask   =   RVIM_IMAGE;rvi.iSubItem   =   x;rvi.iImage=iImageID;m_rc->SetItem(&rvi)  
  #define   GETFOCUSITEM(nItem)   rvi.nMask   =   RVIM_STATE;for(rvi.iItem=0;rvi.iItem<m_rc->GetItemCount();rvi.iItem++)   if(m_rc->GetItem(&rvi)   &&   rvi.nState&RVIS_FOCUSED)   {   nItem   =     rvi.iItem;   break;   }  
   
  class   CJyOperationBase   :   public   CCmdTarget  
  {  
  DECLARE_DYNCREATE(CJyOperationBase)  
  //   Operations  
  public:  
  void   InitMenu(int   iMenu);  
  static   void   SetListView(CJyListView   *   pListView);  
  static   CJyOperationBase   *   CreateOperation(CRuntimeClass   *   pRCOperation);  
  //   protected   constructor   used   by   dynamic   creation  
  //   Attributes  
  protected://   注意这里  
  static CJyListView* m_pListView;  
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CJyOperationBase)  
  public:  
  virtual BOOL   ImportInfoFromDatabase(){return   FALSE;};  
  virtual BOOL   UpdateColInfo(){return   FALSE;};  
  virtual BOOL   OnInit(){return   FALSE;};  
  virtual   BOOL   OnActive(){return   FALSE;};  
  virtual   BOOL   OnDeactive(){return   FALSE;};  
  virtual UINT   OnContextMenu(int   iMenu);  
  virtual   void   OnCustomMenu(CMenu*   pMenu){};  
  virtual   void   DoDefaultMenu(){};  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  protected:  
  CJyOperationBase();  
  virtual   ~CJyOperationBase();  
  void   CmdRouteMenu(CWnd*   pWnd,CMenu*   pPopupMenu);  
  //   Generated   message   map   functions  
  //{{AFX_MSG(CJyOperationBase)  
  afx_msg   void   OnFilePrintPreview();  
  afx_msg   void   OnFilePrint();  
  afx_msg   void   OnUpdateFilePrint(CCmdUI*   pCmdUI);  
  afx_msg   void   OnUpdateFilePrintSetup(CCmdUI*   pCmdUI);  
  afx_msg   void   OnUpdateFilePrintPreview(CCmdUI*   pCmdUI);  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  protected:  
  //   用于保存有焦点的项,Sheet中的Apply中  
  INT m_nFocusItem;  
  };  
   
  /////////////////////////////////////////////////////////////////////////////  
   
  //{{AFX_INSERT_LOCATION}}  
  //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
   
  #endif   //   !defined(AFX_BASEOPERATION_H__FFB71D45_6EA6_4152_87E5_4A6BB46AE25B__INCLUDED_)  
  Top

5 楼xdx1024(叶坚峰)回复于 2006-03-01 15:57:38 得分 0

//   BaseOperation.cpp   :   implementation   file  
  //  
  #include   "stdafx.h"  
  #include   "jy.h"  
  #include   "Print\VTFile.h"  
  #include   "Print\PrintFrame.h"  
  #include   "BaseOperation.h"  
  #include   "JyListView.h"  
  #include   "MainFrm.h"  
  #include   "SDIMenu\MenuEx.h"  
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #endif  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CJyOperationBase  
  CJyListView* CJyOperationBase::m_pListView   =   NULL;//注意这里  
   
  IMPLEMENT_DYNCREATE(CJyOperationBase,   CCmdTarget)  
   
  CJyOperationBase::CJyOperationBase()  
  {  
   
  }  
   
  CJyOperationBase::~CJyOperationBase()  
  {  
  if(m_pListView)  
  {  
  CReportCtrl   *   pCtrl   =   m_pListView->GetReportCtrlPtr();  
  pCtrl->DeleteAllItems();  
  }  
  }  
  BEGIN_MESSAGE_MAP(CJyOperationBase,   CCmdTarget)  
  //{{AFX_MSG_MAP(CJyOperationBase)  
  ON_COMMAND(ID_FILE_PRINT_PREVIEW,   OnFilePrintPreview)  
  ON_COMMAND(ID_FILE_PRINT,   OnFilePrint)  
  ON_UPDATE_COMMAND_UI(ID_FILE_PRINT,   OnUpdateFilePrint)  
  ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP,   OnUpdateFilePrintSetup)  
  ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW,   OnUpdateFilePrintPreview)  
  //}}AFX_MSG_MAP  
  END_MESSAGE_MAP()  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CJyOperationBase   message   handlers  
  void   CJyOperationBase::SetListView(CJyListView   *pListView)  
  {  
  m_pListView   =   pListView;  
  }  
   
  CJyOperationBase   *   CJyOperationBase::CreateOperation(CRuntimeClass   *   pRCOperation)  
  {  
  ASSERT(m_pListView   &&   m_pListView->IsKindOf(RUNTIME_CLASS(CJyListView)));  
          ASSERT(pRCOperation->IsDerivedFrom(RUNTIME_CLASS(CJyOperationBase)));  
  CJyOperationBase   *   pBO   =   (CJyOperationBase   *)pRCOperation->CreateObject();  
  return   pBO;  
  }  
   
  void   CJyOperationBase::InitMenu(int   iMenu)  
  {  
  CMenu   menu;  
  CString   strMenu;  
  int   iPos   =   0;  
  int   iMenuID,iCount;  
  //////////Delete   old   operation   menu   from   main   menu  
  CMainFrame   *   pWnd   =   (CMainFrame*)AfxGetMainWnd();  
  CMenuEx   *   pMenu   =   pWnd->GetMainMenu();  
  ASSERT(pMenu);  
  CMenuEx   *   pSubmenu   =   pMenu->GetSubMenu(0);  
  ASSERT(pSubmenu);  
  iCount   =   pSubmenu->GetMenuItemCount();  
  while(iCount>0   &&   pSubmenu->GetMenuItemID(0)>0)  
  {  
  pSubmenu->DeleteMenu(0,MF_BYPOSITION);  
  iCount--;  
  }  
  //////////Copy   new   operation   menu   to   main   menu  
  VERIFY(menu.LoadMenu(IDR_OPERATION_MENU));  
  CMenu   *   pPopup   =   menu.GetSubMenu(iMenu);  
  ASSERT(pPopup);  
  iCount   =   pPopup->GetMenuItemCount();  
  while(   iCount>iPos   )  
  {  
  iMenuID   =   pPopup->GetMenuItemID(iPos);  
  if(   iMenuID>0   )  
  {  
  pPopup->GetMenuString(iPos,strMenu,MF_BYPOSITION);  
  pSubmenu->InsertMenu(iPos++,MF_BYPOSITION,iMenuID,strMenu);  
  }  
  else  
  break;  
  }  
  pSubmenu->LoadToolbar(IDR_OPERATIONTOOLBAR);  
  menu.DestroyMenu();  
  }  
   
  UINT   CJyOperationBase::OnContextMenu(int   iMenu)  
  {  
  CMenuEx   cMenu;  
  VERIFY(cMenu.LoadMenu(IDR_CONTEXT_MENU));  
  cMenu.LoadToolbar(IDR_OPERATIONTOOLBAR);  
  CMenuEx*   pPopup   =   cMenu.GetSubMenu(iMenu);  
  ASSERT(pPopup   !=   NULL);  
  CPoint   pt(GetMessagePos());  
  OnCustomMenu(pPopup);  
  CmdRouteMenu(m_pListView,pPopup);  
  int   iCmd=pPopup->TrackPopupMenu(TPM_LEFTALIGN   |   TPM_RIGHTBUTTON,  
  pt.x,pt.y,m_pListView);  
  cMenu.DestroyMenu();  
  return   iCmd;  
  }  
   
  void   CJyOperationBase::CmdRouteMenu(CWnd*   pWnd,CMenu*   pPopupMenu)  
  {  
  CCmdUI   state;  
  state.m_pMenu   =   pPopupMenu;  
  state.m_pParentMenu   =   pPopupMenu;  
  state.m_nIndexMax   =   pPopupMenu->GetMenuItemCount();  
   
  for   (state.m_nIndex   =   0;    
            state.m_nIndex   <   state.m_nIndexMax;    
            state.m_nIndex++)    
  {  
  state.m_nID   =   pPopupMenu->GetMenuItemID(state.m_nIndex);  
   
  //   menu   separator   or   invalid   cmd   -   ignore   it  
  if   (state.m_nID   ==   0)   continue;    
   
  if   (state.m_nID   ==   (UINT)-1)  
  {  
  //   possibly   a   popup   menu,   route   to   child   menu   if   so  
  CMenu*   pSub=pPopupMenu->GetSubMenu(state.m_nIndex);  
  if(pSub)   CmdRouteMenu(pWnd,pSub);  
  }  
  else    
  {  
  //   normal   menu   item,   Auto   disable   if   command   is    
  //   _not_   a   system   command.  
  state.m_pSubMenu   =   NULL;  
  state.DoUpdate(pWnd,   FALSE);  
  }  
  }  
  }  
   
  void   CJyOperationBase::OnFilePrintPreview()    
  {  
  if(CJYApp::m_pFrame   &&   IsWindow(CJYApp::m_pFrame->GetSafeHwnd()))  
  CJYApp::m_pFrame->SetFocus();  
  else  
  {  
  CJYApp::m_pFrame   =   new   CPrintFrame;  
  CJYApp::m_pFrame->LoadFrame(IDR_MAINFRAME,  
  WS_OVERLAPPEDWINDOW   |   FWS_ADDTOTITLE,   NULL,NULL);  
  CJYApp::m_pFrame->ModifyStyleEx(WS_EX_CLIENTEDGE,0);  
  CJYApp::m_pFrame->NeedPreView(TRUE);  
  //1:  
  //*  
  if(m_pListView)  
  CJYApp::m_pFrame->SetTemplateWnd((CWnd*)m_pListView->GetReportCtrlPtr());  
  //*/  
  ////////////////////////////////////////////////////////////////////////////////////////  
  //2:  
  /*  
  CVTFile   vtfile;  
  BOOL   bFind   =   vtfile.GetFile(PRINTTEMP);  
  while(bFind)  
  {  
  bFind   =   vtfile.GetNextFile();  
  CJYApp::m_pFrame->LoadPrintTemplate(vtfile.GetFileName());  
  break;  
  }  
  vtfile.CloseSearch();  
  CJYApp::m_pFrame->LoadPrintTemplateParam("2002\n2\n26\n100009\n5020012039012390123\n2002-12-4\n"  
  "10020-0839-85-00\nKing\n502301123102301\n成都\n2002-1-23\n");  
  //*/  
  ////////////////////////////////////////////////////////////////////////////////////////  
  CJYApp::m_pFrame->m_pView->OnFilePrintPreview(CJYApp::m_pFrame);  
  CJYApp::m_pFrame->ShowFrame();  
  }  
  }  
   
  void   CJyOperationBase::OnFilePrint()    
  {  
  if(CJYApp::m_pFrame   &&   IsWindow(CJYApp::m_pFrame->GetSafeHwnd()))  
  CJYApp::m_pFrame->SetFocus();  
  else  
  {  
  CJYApp::m_pFrame   =   new   CPrintFrame;  
  CJYApp::m_pFrame->LoadFrame(IDR_MAINFRAME,  
  WS_OVERLAPPEDWINDOW   |   FWS_ADDTOTITLE,   NULL,NULL);  
  CJYApp::m_pFrame->ModifyStyleEx(WS_EX_CLIENTEDGE,0);  
  CJYApp::m_pFrame->NeedPreView(FALSE);  
  if(m_pListView)  
  CJYApp::m_pFrame->SetTemplateWnd((CWnd*)m_pListView->GetReportCtrlPtr());  
  ////////////////////////////////////////////////////////////////////////////////////////  
  CJYApp::m_pFrame->m_pView->SendMessage(WM_COMMAND,   ID_FILE_PRINT);  
  CJYApp::m_pFrame->ShowFrame();  
  }  
  }  
   
  void   CJyOperationBase::OnUpdateFilePrint(CCmdUI*   pCmdUI)    
  {  
  pCmdUI->Enable(m_pListView?TRUE:FALSE);  
  }  
   
  void   CJyOperationBase::OnUpdateFilePrintSetup(CCmdUI*   pCmdUI)    
  {  
  //   TODO:   Add   your   command   update   UI   handler   code   here  
   
  }  
   
  void   CJyOperationBase::OnUpdateFilePrintPreview(CCmdUI*   pCmdUI)    
  {  
  //   TODO:   Add   your   command   update   UI   handler   code   here  
   
  }  
  Top

6 楼xdx1024(叶坚峰)回复于 2006-03-01 16:07:05 得分 0

BaseOperation.h中  
  protected://   注意这里  
  static CJyListView* m_pListView;  
   
  BaseOperation.cpp   中  
  CJyListView* CJyOperationBase::m_pListView   =   NULL;//注意这里  
   
  请问这两处的关系如何?我理解为   static CJyListView* m_pListView;  
  是定义了该类的实例。既然是保护类型的,m_pListView应该使用受限,  
  但我在代码中,发现了大量  
  CReportCtrl   *   m_rc   =   m_pListView->GetReportCtrlPtr();语句。  
  问题出在哪里?  
  Top

7 楼dnliophsam()回复于 2006-03-01 16:09:39 得分 4

在你的代码中m_pListView被声明为静态变量  
  因此调用时要带类名譬如CJyOperationBase   *   lpListView   =   CJyOperationBase::m_pListView;  
   
  另外,这个变量被声明为protected类型,只能被该类或者其子类或友元类友元函数访问。Top

8 楼hazrael(没事儿偷着乐)回复于 2006-03-01 16:34:14 得分 4

什么样的代码?说得不够清楚Top

9 楼xdx1024(叶坚峰)回复于 2006-03-02 15:56:01 得分 0

各位高手:分不多,撒胡椒面了。谢谢各位。Top

相关问题

  • 如何在JS中声明一个类,并且实例化这个类的一个对象?能不能有继承关系?
  • 类为什么不能实例化??
  • 紧急求助!!!!---写个关于类的继承的简单实例!!!1
  • 父类中的方法包含THIS指针,在继承类中它是指向父类实例还是继承类实例?为什么在继承类中该指针为NULL值?
  • 接口能不能继承抽象类?
  • 类属类不能实例化????高手们,帮我看看??
  • 不能把一个抽象类中的对象实例化?
  • 抽象类不能创建实例,那有什么用处??
  • 抽象类不能实例化到底是什么意思
  • 抽象类和接口不能实例化吗?

关键词

  • 语句
  • 文件
  • 代码
  • virtual
  • plistview
  • rvi
  • cjyoperationbase
  • baseoperation
  • staticcjylistview
  • 实例

得分解答快速导航

  • 帖主:xdx1024
  • wenkui
  • missle
  • missle
  • dnliophsam
  • hazrael

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo