I tend to prefer using set/get these days with a little helper class:
Code:
template<typename Type, typename Class> class CUtilityMember
{
private:
Type Data;
typedef const Type& (Class::*GetFncPointer)();
typedef void (Class::*SetFncPointer)(const Type& NewData);
GetFncPointer m_pGet;
SetFncPointer m_pSet;
Class* m_pClass;
public:
CUtilityMember(Class* pClass, GetFncPointer pGet = NULL, SetFncPointer pSet = NULL);
CUtilityMember(const Type& NewData, Class* pClass, GetFncPointer pGet = NULL,
SetFncPointer pSet = NULL);
CUtilityMember& operator = (const Type& NewData);
operator Type () const;
};
template<typename Type, typename Class> CUtilityMember<Type, Class>::CUtilityMember
(Class* pClass, GetFncPointer pGet, SetFncPointer pSet): m_pClass(pClass), m_pGet(pGet),
m_pSet(pSet) { }
template<typename Type, typename Class> CUtilityMember<Type, Class>::CUtilityMember
(const Type& NewData, Class* pClass, GetFncPointer pGet, SetFncPointer pSet):
Data(NewData), m_pClass(pClass), m_pGet(pGet), m_pSet(pSet) { }
template<typename Type, typename Class> CUtilityMember<Type, Class>&
CUtilityMember<Type, Class>::operator = (const Type& NewData)
{
if (m_pSet)
(m_pClass->*m_pSet)(NewData);
else
Data = NewData;
return *this;
}
template<typename Type, typename Class> CUtilityMember<Type, Class>::operator Type () const
{
if (m_pGet)
return (m_pClass->*m_pGet)();
else
return Data;
}
And to use it:
Code:
CFilter(CString strExt = _T(""), CString strDescription = _T("")): strExt(strExt, this),
strDescription(strDescription, this) { }
CUtilityMember<CString, CFilter> strExt;
CUtilityMember<CString, CFilter> strDescription;
Optionally, if you want to extra things rather than just set/get the value of the class, then you can provide a class function pointer to a get/set function within your own class.
It's not 100% finished yet, but it will allow you to do
Myclass.MyVar = somevalue;
And
sometype somevalue = Myclass.MyVar;
Without sacrificing the encapsulation. You can add more operators as necessary.