有关C++/VC/MFC的一些小知识

1. CString内部有一个指针用于存放字符串,当发生浅拷贝时,直接把原来的地址复制到新的对象中,并且引用+1;只有当字符串发生变化时,才会重新申请地址,并且原地址引用-1;只有当地址的引用为0时,该地址的内存才会释放。

2. 由于1中的特性,给PostMessage消息传递局部定义的CString转换的LPCTSTR会导致读出来的是乱码,这是因为PostMessage是异步操作,当消息读取字符串时,地址已经被释放掉了,所以读出来的是乱码。当然,线程也是同理。一个解决办法就是把字符串存到全局变量中,并且保证在读取之前不要更改变量,否则字符串自然会发生乱码的情况。(每个用途单独给一个变量,不要混用,要保证这个变量在读取使用之前都不会被覆盖)

3. 有时候需要类互相嵌套,例如 CMain 需要引入 CDlg,而 CDlg 也需要调用 CMain。这时候,Main.h 可以#include "Dlg.h",但是 Dlg.h 则不能 #include "Main.h",这是因为编译器会先去解析 Dlg.h,此时 CMain 类还未定义。这时在 Dlg.h 中可以通过 class CMain; 这样的声明来代替引入 Main.h,就像我们在其他文件引入全局变量一样。这并不会引起“重定义”错误,因为它只是一个声明。我们经常可以看到类的定义,却很少见到它的声明,所以容易忽略这样的用法。给出示例代码:

Main.h

#include "Dlg.h"

class CMain
{
    .....
    CDlg m_Dlg;
}

Dlg.h

class CMain; // 这里直接做声明,如果cpp中要调用的话,在cpp中#include "Main.h"即可

class CDlg
{
    ......
    CMain* m_pMain; // 必须是指针,不然会报错
}

发表评论