为什么类的实例不能继承?
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




