MFC日志(2011.4.10)

1.关于超前引用

这是个一般不太会接触到的问题,我是因为想要让view类和doc类之间的访问变得简单才遇到了这个问题。我的设想是:在doc类中设置一个指向view的成员变量,但是加上之后总提示我该类(view类)未被定义,我就奇了怪了,头文件也是包含过的,即view类和doc类的cpp文件中都包含了彼此的头文件。

上网查了下,发现这个是C++的机制造成的,编译器在编译的时候只会根据头文件的顺序编译一次,在doc类的cpp中,是先包含的doc.h然后是view.h,因此,不可能在doc类中定义view类的指针,因为那时候view还没有包含进来。因此这种情况叫超前引用,网上原文如下:

更一般的情况,类A和类B需要彼此互相引用,这样必然有一个类会先被定义,而另外一个类后被定义,这样在先被定义的类引用后被定义的类的时候,就导致了所谓的超前引用。
超前引用导致的错误有以下几种处理办法:
1) 使用类声明
在超前引用一个类之前,首先用一个特殊的语句说明该标识符是一个类名,即将被超前引用。其使用方法是:
a) 用class ClassB;声明即将超前引用的类名
b) 定义class ClassA
c) 定义class ClassB;
d) 编制两个类的实现代码。
上述方法适用于所有代码在同一个文件中,一般情况下,ClassA和ClassB分别有自己的头文件和cpp文件,这种方法需要演变成:
a) 分别定义ClassA和ClassB,并在cpp文件中实现之
b) 在两个头文件的开头分别用class ClassB;和class ClassA;声明对方
c) 在两个cpp文件中分别包含另外一个类的头文件
NOTE:这种方法切记不可使用类名来定义变量和函数的变量参数,只可用来定义引用或者指针。

上面的解决方法测试通过。另外还有两种方法,没有尝试,写在这留作存档。

2) 使用全局变量
由于全局变量可以避免超前引用,不用赘述。我的习惯是,把类对象的extern语句加在该类头文件的最后,大家喜欢
怎样写那都没有什么大问题,关键是保证不要在头文件中胡乱包含。
3) 使用基类指针。
这种方法是在引用超前引用类的地方一律用基类指针。而一般情况下,两个互相引用的类并不涉及其基类,因此不会造成
超前引用。以开始的例子说:在CMyDialog类中用CView
*代替CMyView*,在CMyView类中用CDialog*代替CMyDialog*,这样必然
不会造成超前引用。

参考资料:http://www.vckbase.com/bbs/prime/viewprime.asp?id=431

2.关于静态库下CRectTracker无法显示鼠标光标解决方案

原因:

当应用程序通过使用静态库链接到 MFC 时, MFC 资源被编译到应用程序的可执行文件。 应用程序的可执行文件将包括在 Afxres.rc 文件。 若要检查这,单击 资源包含 在 视图 菜单上。 在 Afxres.rc 文件拥有 CRectTracker 使用 MFC 源代码中的资源。    这些资源不是是 _AFX_NO_TRACKER_RESOURCES 时,包括只定义的。 BLOCKS32 项目具有 _AFX_NO_TRACKER_RESOURCES 定义的。 因此,它确实不置于应用程序的可执行映像 CRectTracker 需要的资源。 因此,没有任何所使用的 CRectTracker 游标会在生成该示例通过使用 MFC 静态时显示。

解决方案

在资源视图中,在rc中点击 Resource Includes,然后 删除以下行:    #define _AFX_NO_TRACKER_RESOURCES。

参考资料:http://blog.csdn.net/qsycn/archive/2009/10/27/4733493.aspx


原文地址:https://www.cnblogs.com/xweiwei/p/2011456.html