C++属性的实现

在其他语言中, 例如 C#或者 objective-c 中,均有属性这语法.
下面就实现这语法功能.

思索

通常来说,一个属性由 getter 和 setter 来进行读和写.其普通形式如下:<pre>void set_name(T val); T get_name();</pre> 我们定义一个宏:<pre>#define property(T, name) T get_##name(); void set_##name(T val)</pre> 实现了定义2个方法,来控制读取.
可是这是2个函数啊.依然不像 C#一样可以通过一个对象值来读写啊!
对象值,要怎么实现? 对象, 对象,即这是一个类 class!
类定义变量名,每个变量名称不一样,代表着不同的属性名!
可问题又来了,不同属性类型不一样啊!
类型不一样, C++ 就有专治这问题的解决方案! 模板!

属性类模板

<pre>template<typename ClassName, typename T>
class PropertyClass{
public:
typedef T(ClassName::*GetterType)();
typedef void (ClassName::*SetterType)(T val);
private:
ClassName* obj;
GetterType getter;
SetterType setter;
public:
explicit PropertyClass(ClassName* o, GetterType g, SetterType s) : obj(o), getter(g), setter(s){}
operator T(){return (obj->*getter)();}
PropertyClass& operator=(T val) { (obj->*setter)(val); return *this;}
};</pre>

宏:

<pre>#define property(C, T, N) PropertyClass<C, T> N; T get_##N(); void set_##N(T val)

define set_property(C, N) N(this, &C::get_##N, &C::set_##N)</pre>

用法

<code>class A
{
int _age;
public:
property(A, int, age);
A();
};
A::A() : set_property(A, age){}
int A::get_age() { return _age; }
void A::set_age(int a) { _age = a; }</code>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 成长的名字叫责任,因为有要保护的人,所以不想逃避,想要直面困难,变得更强更好。 成长的名字叫妈妈,...
    lambe12阅读 1,355评论 0 0
  • 荷兰的阿姆斯特丹是我们第二次欧洲行的第一站,史基浦机场乘车十几分就能到达。 城市不大,可以用双脚丈量。只是因为航班...
    用心生活用字记录阅读 3,251评论 4 4
  • 早上五点多自然醒 翻来覆去还是睡不着 起床去教室背单词 下宿舍楼时 打扫卫生的阿姨蜷坐在全身镜旁的地上 手里拿了一...
    大大大大大脸猫阅读 1,283评论 0 0
  • Spring WebSocket: Handshake failed due to invalid Upgrade...
    AmeeLove阅读 11,651评论 0 0

友情链接更多精彩内容