一种直接访问C++对象的protected成员的通用方法

 

Motivation

     通过一个 C++ 对象的指针直接访问该对象的 protected 成员变量,无需修改该类的实现,这是我们使用第三方 C++ 类库时常见的需求。

 

My Approch

 

#define PROTECTED_CAST_DECL (CLASS_TYPE ,MEMBER_TYPE ,MEMBER_NAME )          /

         template <typename ClassType , typename MemberType >                   /

         class C ##MEMBER_NAME ##Accessor                                        /

         {                                                                    /

                   class CAccessor : public ClassType                                 /

                   {                                                                /

                            friend class C ##MEMBER_NAME ##Accessor ;                       /

                   };                                                               /

         public :                                                              /

                   static MemberType & GetMember (ClassType * pClass )                 /

                   {                                                                /

                            return ((CAccessor *)pClass )->MEMBER_NAME ;                    /

                   }                                                                /

         };

 

#define PROTECTED_CAST (CLASS_TYPE ,CLASS_OBJECT_PTR ,MEMBER_TYPE ,MEMBER_NAME ) (C ##MEMBER_NAME ##Accessor <CLASS_TYPE , MEMBER_TYPE >::GetMember (CLASS_OBJECT_PTR ))

 

Sample

   以下示例代码展示了 PROTECTED_CAST 的使用方法,代码在 VC++ 2008 下测试通过。

class CPrivateMemberWrapper

{

protected :

         int m_iValue ;

         double m_dValue ;

         string m_sValue ;

public :

         CPrivateMemberWrapper (int i , double d , const char * lps ):

           m_iValue (i ), m_dValue (d ), m_sValue (lps )

         {}

         ~CPrivateMemberWrapper () {}

};

PROTECTED_CAST_DECL (CPrivateMemberWrapper , int , m_iValue )

PROTECTED_CAST_DECL (CPrivateMemberWrapper , double , m_dValue )

PROTECTED_CAST_DECL (CPrivateMemberWrapper , string , m_sValue )



int _tmain (int argc , _TCHAR * argv [])

{

         CPrivateMemberWrapper Wrapper (1979, 3.14, "CPrivateMemberWrapper" );

 

         cout << PROTECTED_CAST (CPrivateMemberWrapper , &Wrapper , int , m_iValue ) << endl ;

         cout << PROTECTED_CAST (CPrivateMemberWrapper , &Wrapper , double , m_dValue ) << endl ;

         cout << PROTECTED_CAST (CPrivateMemberWrapper , &Wrapper , string , m_sValue ) << endl ;

        

         return 0;

}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值