为C++的类添加属性和事件
在Visual Basic中,一个类具有属性、方法和事件等几个特征,而C++中的类只提供方法,使用时稍显麻烦。本文的目的就是在C++的类中模拟实现属性和事件。
(C)ShiShengSoft原创文章,转载请注明出处:http://blog.csdn.net/shishengsoft/
一、类的属性
首先,我们看看在VB中如何编写一个类MyClass的属性。
Private m_MyProperty As Long
'写属性
Property Let MyProperty(ByVal value As Long)
m_MyProperty = value
End Property
'读属性
Property Get MyProperty() As Long
MyProperty = m_MyProperty
End Property
当使用这个类创建对象后,它的属性调用方法如下:
Dim theClass As New MyClass
theClass.MyProperty = 100 '写属性
Dim i As Long
i = theClass.MyProperty '读属性
由上可见,在VB中,属性的读和写两个过程使用了同一个名字MyProperty。而在C++的类中,完成这个功能通常是使用set和get两个方法来实现的。那么,可以让C++也使用同一个名字的方法来实现属性的读和写呢?答案是肯定的。
我们先看看,在C++中如何用set和get方法来改变成员变量的。
类的代码如下:
class MyClass
{
public:
void setMyProperty(long value)
{
m_MyProperty = value;
}
long getMyProperty()
{
return m_MyProperty;
}
private:
long m_MyProperty;
};
用这个类创建一个对象,其调用代码如下:
MyClass theClass ;
theClass.setMyProperty(100);
long i=theClass.getMyProperty();
以上可以看出,为了读和写类的私有成员变量m_MyProperty,分别使用setMyProperty和getMyProperty两个方法。
而C++提供了一种函数重载的技术,可以实现上面VB属性那样,只用一个MyProperty方法来完成setMyProperty和getMyProperty的功能。只要将类的代码改成如下即可。
class MyClass
{
public:
void MyProperty(long value)
{
m_MyProperty = value;
}
long MyProperty()
{
return m_MyProperty;
}
private:
long m_MyProperty;
};
而这个类的对象的使用如下:
MyClass theClass ;
theClass.MyProperty(100);
long i=theClass.MyProperty();
如此是否显得简洁一些呢?下面我们再看如何实现事件过程。
二、类的事件
先来看看在VB中如何使用类的事件。特别指出,这里的事件不是Windows的消息事件,而是类的自定义事件。
'在类中声明一个事件
Public Event MyEvent()
'触发一个事件
RaiseEvent MyEvent
在创建对象后如何调用这个事件呢?如下:
'声明一个事件类的对象,注意WithEvents关键字
Public WithEvents theClass As MyClass
'创建对象,不能和声明放在一条语句
Set theClass = New MyClass
'调用事件
Private Sub theClass_MyEvent()
'添加事件处理代码
End Sub
在VB中提供了类的事件机制,它在对象内部的数据改变时,可以通知用户在外部进行处理,提高了与用户的交互能力。
接下来我们看看在C++中如何实现类似的事件功能。先看类的代码:
class MyClass
{
typedef void (*pFunc)(void);
public:
void MyEvent(pFunc pEventFunc)
{
m_pMyEvent=pEventFunc;
}
void Run()
{
try
{
m_pMyEvent();
}
catch(...){}
}
private:
pFunc m_pMyEvent; // 保存事件函数的指针
};
接着看调用对象的代码,如下:
//事件函数
void EventFunc(void)
{
cout<<"raise event. "<<endl;
}
int main()
{
MyClass theClass ;
theClass.MyEvent(EventFunc);
theClass.Run();
return 0;
}
由上面代码可知,在C++中,其实就是使用回调函数来模拟类似于VB的类的事件机制。首先将一个函数的指针保存的类的私有变量中,当需要触发事件时,则通过先前保存的函数指针来调用函数即可。
暫时写这么点(这么多),读者若有不明之处,日后再说。