介紹在C++中利用模板來實現對象Property的方法。這個方法在Linux下用g++編譯調試通過。但未在正式的工程中使用過。還請大家多提意見。
在C++Builder, 可以通過CB的擴展語法__property()來實現對象的Property。但這個方法必需有編譯器的支持,脫離了CB的編譯環境就無法使用。同樣的,在VC6.0以上的版本中,也實現了__declspec(property)這樣一個語法來實現property.它除了跟CB 中的perperty一樣,在跨平臺方面有局限性以外,而且他不支持多態。 下面的例子可以說明: class M
{
private:
int v;
virtual int Get()
{
return v;
}
virtual void Set(int x)
{
v = x;
}
public:
__declspec(property(get=Get,put=Set)) int XValue;
}; class MM : public M
{
virtual int Get()
{
return v+3;
}
virtual void Set(int x)
{
v = x -3;
}
}; MM m;
m.XValue = 3; //實際上調用的是M::Set(),而不是MM::Set()
int v = m.XValue; //實際上調用的是M::Get(), 而不是MM:Get();
為什么呢?因為在編譯器進行編譯的時候,已經將這個property跟 M::Get(),M::Set()邦定在了一起。 鑒于上面所述,我們提出我們目標: 1. 要實現Property,并且不依賴于某一個開發平臺,只要是當前流行的C++編譯器都可以編譯通過。 2. 必須使這種Property的實現方法符合OOP的法則。 只有達到以上兩點,才能使我們的方法有實用性。 下面我們利用C++的模板方法來實現Property. 這個方法未必是最好的,而且在實際使用的時候還會是有問題的。但也算是學習一下C++的Template了。 首先來看看Property的基本實現原理。在C++語法中,是沒有Property這樣的語法的。在C++中,Property就相當于類成員變量,我們可以把成員變量暴露在Public域,這樣我們可以任意操作他,而不用很麻煩的去調用某一個操作函數(看上去就象在VB中操作對象的Property一樣)。但實際上這是一種很不安全的方法,因為我們失去了對這個成員變量的控制,那將會發生很多意料不到的事情。 因此在C++中,Property的實現都是通過成員函數來模擬實現的。比如: class A { private: int x; public: void get_X(int& v); void put_X(int v); } 類A中的成員函數X,就是通過get_X()和put_X()這兩個函數來實現訪問的。這將保證變量x盡量的處于我們的保護之中(可以在get_X,put_X中寫入我們對x的保護代碼)。
那么能否通過某一種方法,來隱藏對get_和put_函數的調用,而類似于: A.X_Value = 3; //其實是間接調用A.put_X(3) int a = A.X_Value; //其實是間接調用A.get_X();這樣的語法呢? 可以通過C++的模板技術來實現。要實現這樣的語法,我們需要一個代理模板類, 在這個模板類中,我們重載操作符"=", 在這個重載的operator =()函數中,我們調用宿主對象的put_X()函數,把值傳入. 然后我們還要重載屬性值類型的操作符, 比如屬性值的類型是 string ,則我們要重載一個叫string的操作符, 并在 operator string()中調用宿主對象的get_X()函數,把值傳出去.
文章來源于領測軟件測試網 http://www.kjueaiud.com/