或许很多人看了我这个标题,很想打我:类的变量都私有了。你访问个P啊。
不过事实上地球还真有类似的需求。
记得2004年的时候,那会做个小的游戏引擎,大部分的数据都是私有或者保护的,这些在应付游戏本身的时候已经完全足够了。但是后来做编辑器的时候,发现绝大部分私有或者保护的成员都是需要被外部访问到的。但是实在又不想每个函数都开个 T& GetXXX(). 这样跟public没啥区别了。
一气之下,就在编辑器里stdafx.h里直接把 protected和private全部define成public了。 我的引擎当时是以源代码的形式编译的。这个一点问题都没有。
前段时间使用VS 2010的MFC Outlook Tabbar。我的Outlook Tabbar是在插件里创建的。有几个页也是由插件数量决定的。于是悲剧来了。那个小图标的ImageList 是个私有的变量。 而且,我必须得动态往这个ImageList里添加ICON。。不然。。。哼哼。。
这里因为MFC不是我自己的东西。我不能把protected给定义成public。除非我把MFC的代码全加到工程里来自己编译。否则会导致unresolved symbol的。憋了半天。想了个损招:
CMFCOutlookBarTabCtrl 这个是包含了ImageList的类。是MFC的。怎么办的?有啥办法能访问到proteced的变量呢?那就是派生了。
于是:
class CMFCOutlookBarTabCtrlDerived: public CMFCOutlookBarTabCtrl
{
public:
CImageList* GetToolbarImageList()
{
return &m_imagesToolbar;
}
CMFCOutlookBarToolBar* GetToolbar()
{
return &m_wndToolBar;
}
};
派生类当然顺理成章的能访问父类的。嘿嘿。
但是能从OutlookToolbar里拿到的只能是 CMFCOutlookbarTabCtrl. 怎么办呢?强行转换一下。C语言的无敌cast啊。
CMFCOutlookBarTabCtrlDerived* pDevired = (CMFCOutlookBarTabCtrlDerived*)m_pCurrOutlookWnd;
CImageList* pSmallImgList = (CImageList*)pDevired->GetToolbarImageList();
pSmallImgList->Add(pElement->hSmallIcon() );
搞定收工。
注意:此法比较卑鄙,未成年人请勿模仿。