今天发现的一个VC6.0在私有变量声明时的BUG

 如果有人说,VC的宏能够影响到类成员变量的属性,你信吗?反正是我信了!

今天在修改一个程序的时候,我在类A的外部使用指向类B的指针,居然能够访问到类B的受保护成员变量!!!!!这让我感到非常奇怪,于是来到变量的声明处,以前由于自己懒,直接在自动生成的代码后边进行声明。

代码如下:

protected: // create from serialization only
	CMSampleView();
	DECLARE_DYNCREATE(CMSampleView)
	CMapX  m_ctrlMapX;


 

我就想是不是DECLARE_DYNCREATE这个宏影响到了m_ctrlMap的属性呢?

于是我在m_ctrlMap前面加上访问修饰符protected。于是就可以受保护成员变量就能“被保护了”。

error C2248: 'm_ctrlMapX' : cannot access protected member declared in class 'CMSampleView'

 

————————————     华丽的分割线    ———————————


最近被人提到这个问题,他说这里不能算是一个bug,也就是说DECLARE_DYNCREATE做了某些不好的事情。那么看下这个宏到底干了啥:

#define DECLARE_DYNCREATE(class_name) \
DECLARE_DYNAMIC(class_name) \
static CObject* PASCAL CreateObject();

#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const CRuntimeClass class##class_name; \
static CRuntimeClass* PASCAL GetThisClass(); \
virtual CRuntimeClass* GetRuntimeClass() const; \

现在谜底揭晓了:

DECLARE_DYNCREATE包含了DECLARE_DYNAMIC,而DECLARE_DYNAMIC里面在末尾使用了public修饰符,然后,使用的

m_ctrlMapX变量就被这个public影响到了。

btw,C里面的宏确实在使用的时候得小心一点,在C++里面尽量少用宏定义,如常量定义,不要写成

#define MAX_LENGTH1024

写成:

const int MAX_LENGTH = 1024;

如果只在本文件中使用,最好写成:

static  const int MAX_LENGTH = 1024;


简洁明了的变量定义,在很多时候能够帮助到我们,减少代码里面出现某些诡异bug。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值