也用 C++ 實現 Property 功能 (轉)

gugu99發表於2007-08-17
也用 C++ 實現 Property 功能 (轉)[@more@]

用 或者 Borland C++ Builder 的時候會遇見“property”這個東西,可以控制讀寫方式。標準 C++ 並沒有這個概念,那麼我們能否在純 C++ 中使用這個功能呢?當然可以。下面是本人獨立完成的一個實現方法:

#include
using namespace std;

typedef enum {READONLY, READWRITE} RW_Right;

template  typename _Ty /* 該屬性的型別 */,
 RW_Right = READWRITE /* 該屬性的:預設為讀寫 */ >
class Property
{
public:
 typedef _Ty* (_Class::*Getter)(void);
 typedef void (_Class::*Setter)(const _Ty&);
public:
 Property(_Class& _src /* 目標*/,
 const Getter _getter /* 取值 */,
 const Setter _setter /* 賦值函式 */)
 :m_src(_src), m_getter(_getter), m_setter(_setter)
 {}
 operator _Ty&() /* 返回 lvalue */
 {
 return *(m_src.*m_getter)(); /* 可以直接對原始資料賦值 */
 }
 operator const _Ty&() const
 {
 return *(m_src.*m_getter)();
 }
 _Ty& operator=(const _Ty& _value) /*返回一個 lvalue */
 {
 (m_src.*m_setter)(_value);
 return *(m_src.*m_getter)();
 }
private:
 _Class& m_src; /* 儲存宿主類資訊 */
 Getter m_getter; /* 宿主取值函式 */
 Setter m_setter; /* 宿主賦值函式 */
 Property(); /* 必須在宿主類建立的同時初始化 */
 Property(const Property&);
 Property& operator=(const Property&);
};

template
class Property <_class _ty="" readonly="">
{
public:
 typedef _Ty* (_Class::*Getter)(void);
public:
 Property(_Class& _src, const Getter _getter)
 :m_src(_src), m_getter(_getter)
 {}
 operator const _Ty() const /* 只能返回 rvalue */
 {
 return *(m_src.*m_getter)();
 }
private:
 _Class& m_src;
 Getter m_getter;
 Property();
 Property(const Property&);
 Property& operator=(const Property&);
 _Ty& operator=(const _Ty& _value); /* 禁止賦值操作 */
};

class MyClass
{
public:
 int* get_count()
 {
 cout << "Getting property" << endl;
 return &m_count;
 }
 void set_count(const int& _count)
 {
 cout << "Setting property" << endl;
 m_count = _count;
 }
public:
 MyClass()
 :Count(*this, &MyClass::get_count, &MyClass::set_count)
 {}
 Property Count;
private:
 int m_count;
};

int main(int argc,char* argv[])
{
 MyClass mc;
 mc.Count = 2;
 int j = mc.Count;
 cout << j << endl;
 return 0;
}

以上測試編譯會出現 warning
warning C4355: “this” : 用於基成員初始值設定項列表

不用擔心。 7.1 編寫,本人版權所有,有意見建議請發短訊息。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963513/,如需轉載,請註明出處,否則將追究法律責任。

相關文章