从文档类获得视图类指针的一点疑惑
资料上说从文档类获得视图类指针是这样的
CView* CTestDoc::GetVieww(CRuntimeClass* pClass)
{ CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL)
{
pView=GetNextView(pos);
if(pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass))
return NULL;
return pView;}
使用该函数应遵循如下格式(以取得CTestView指针为例):
CTestView* pTestView=GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
可我认为为什么函数的形参要是CRuntimeClass*呢?这样调用时候还需加RUNTIME_CLASS,
形参直接用CView*不就可以了吗?调用时直接GetView(CTestView)。不知我的浅见对不对,谢谢。
问题点数:40、回复次数:9Top
1 楼rediori(江枫)回复于 2001-09-27 12:15:17 得分 5
不是定是cview, 是个cformview呢
或者是个ceditview 或者是你派生的类Top
2 楼jiangping_zhu(娜可露露之风之刃)回复于 2001-09-27 12:25:43 得分 0
if(pView->IsKindOf(pClass))
该函数用判断得到的pView是否为指定类的派生类,如果不是的话,返回的指针要强行转换指针的后,使用时可能会出现错误。按照你的理解,将无法判断该对象是否可以转换成你要的类对象。使用时肯定会有隐患的。Top
3 楼archy(archy)回复于 2001-09-27 13:28:29 得分 0
可是CVIEW是所有view的基类呀,不会有问题吧Top
4 楼jiangsheng(蒋晟.Net[MVP])回复于 2001-09-27 14:19:51 得分 10
要判断是否是某种View的对象,只能用这种View的RUNTIME_CLASS。Top
5 楼jiangping_zhu(娜可露露之风之刃)回复于 2001-09-27 14:42:23 得分 0
虽然为基类,但未必是某种派生类,你需要用的是派生类的功能,就应该判断该对象是否为该该类的派生类,否则强制类型转换才不会出现隐患Top
6 楼archy(archy)回复于 2001-09-27 20:17:39 得分 0
小子愚笨,谁能举个例子说得再清楚一点呢?
此体再加20分Top
7 楼jiangping_zhu(娜可露露之风之刃)回复于 2001-09-28 09:09:30 得分 25
例如:CEditView派生于CView;
CView* pView = new CView;
如果这样调用
(CEditView*)pView->Member();(改成员为CEditView的成员函数就有可能出错)
只有当
CView* pView = new CEditView;时或者为CEditView的派生类时调用才能成功。也是就是该对象是不是CEditView的对象(派生类对象也是CEditView的对象)。
你的问题中传递参数CRuntimeClass,就是用来判断得到对象是不是指定的类对象,如果不判断,你在转换时就可能有隐患Top
8 楼archy(archy)回复于 2001-09-30 20:13:38 得分 0
我的老师说“假设一个view由CtestView类产生,而另外一个view由CtestView2类产生,在这种情况下,如果使用你的方法,如果我要查找由CtestView2类产生出的View,你该如何进行呢?”
可我认为,无论是何view类,其基类必定是CView,所以按照此函数,必定(若存在)可获得一个指向欲查找的派生类对象(如CEditView)的基类pView指针。不知您认为怎样?
谢谢Top
9 楼bighead(bighead1997)回复于 2001-09-30 20:56:55 得分 0
为什么要得到view类呢?Top




