高级语言的面向对象编程模型一般都支持“属性”接口,例如 Visual Basic 和 C#。在C#中,通过访问属性,不仅可以存取数据,还可以在存取时执行其它操作,在代码形式上,改变属性值可以写成给变量赋值的形式,例如:Form1.Size = System.Drawing.Size(640,480),而不是调用函数:Form1.SetSize ...(实际上Form没有SetSize函数)。C++语言不支持对象属性,对象的可执行接口只有函数,所以C++里没有“属性”和“方法”的概念。但是通过一些编程的技巧,可以实现一个属性访问器,使 C++ 代码可以具有和 C# 相似的编程风格。
属性访问器模板
代码如下:
template<typename TObject, typename TProperty>
struct PropAccessor
{
TObject* Instance;
PropAccessor(TObject* instance): Instance(instance){}
operator TProperty();
TProperty& operator = (TProperty value);
};
其中:operator TProperty() 用来实现属性的"get"部分,TProperty& operator=(TProperty value) 用来实现属性的"set"部分。
这个模板是不能直接使用的,两个运算符函数都没有实现,为了可以使用,需要继承模板并实现这两个运算符。这样就定义了一个模拟的“属性”。
属性访问器的实现
下面是一个具体的实现例子。MeshNode是用于3D场景的模型对象,float3是一个向量类型,表示Mesh在场景中的位置,float4x4是一个矩阵类型,表示Mesh的变换矩阵。演示的代码是MeshNode中的Position属性。