OnUpdate
的第3个参数是指向CObject
的指针。必须在实现其自己的OnUpdate
的视图类中下调指针。检查演员表是否成功的最佳方法是什么?使用CObject::IsKindOf
或dynamic_cast
?可以在MFC项目中使用RTTI吗?
答案 0 :(得分:1)
如果您使用向导创建了视图,那么它会在您的视图类的头文件中放置一个DECLARE_DYNCREATE。如果您手动创建它,我会确保它在视图的头文件的类定义中有一个DECLARE_DYNCREATE(或者至少DECLARE_DYNAMIC或DECLARE_SERIAL - DECLARE_SERIAL对于视图类来说通常是过度的。)
然后,当你想要向下转换使用DYNAMIC_DOWNCAST宏并在返回时测试非NULL。
CView * pView = DYNAMIC_DOWNCAST(CView,pObject); //是一种用法
不要听建议不使用MFC宏,因为它不可移植......如果你正在编写一个CView派生类,它已经不可移植了 - 除非你使用像Wind / U这样的工具包,然后DYNAMIC_DOWNCAST也可以移植。
答案 1 :(得分:0)
CObject::IsKindOf()
仅在使用DECLARE_DYNAMIC
,DECLARE_DYNCREATE
或DECLARE_SERIAL
(CView
声明它们)声明类时才有效但不需要RTTI支持
虽然dynamic_cast
适用于RTTI支持,但它包含一些开销,可执行文件大小略有增加,check this ..
答案 2 :(得分:0)
我在工作中使用dynamic_cast并没有问题。 检查演员表演很容易: CDerivedView * pView = dynamic_cast(pViewObj); if(!pView){ASSERT(0);返回; }
此外,我们尝试不使用MFC的宏,因为它们是不可移植的 - 例如MFC本身。 我认为,好的程序绝不能依赖于它已被使用的库。