如何访问一个类的保护变量

来源:互联网 发布:中央新闻联播软件 编辑:程序博客网 时间:2024/05/21 10:41

或许很多人看了我这个标题,很想打我:类的变量都私有了。你访问个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() );

 

 

搞定收工。

 

注意:此法比较卑鄙,未成年人请勿模仿。

原创粉丝点击