可以使用模板来实现getter-setter的默认实现。
例如- http://www.kirit.com/C%2B%2B%20killed%20the%20get%20%26%20set%20accessors/A%20simple%20meta-accessor。最重要的是,如果您决定覆盖此类setter或getter的默认行为,您可以轻松地做到这一点,而无需更改“客户端”代码,因为setter-getter调用语法与调用方法相同,即:
an_object.an_int( 3 );
int i = an_object.an_int();在这两种情况下,an_int都可以是带有运算符()或an_object方法的对象。重写后,需要在“客户端”代码中重新编译。
但是,在没有预处理宏的情况下,可以为getter-setter定义“虚拟”默认实现吗?也就是说,这里重要的事情是,在过度编译“客户端”代码是不需要的。当然,使用预处理器是可能的,我想知道,还有更优雅的解决方案吗?
就我所知,C++03是不可能的,但是也许有人有一些想法,或者在C++11中它是可能的?
"David Rodríguez -dribeas“的答案:如下所示:
#define accessor(type,name) \
virtual type name() {return m_##name;} \
type m_##name;它可以在派生类中被重写,而不需要重新编译“客户端”代码。
发布于 2012-03-14 19:01:10
只要函数不是内联的,如果重新实现这些函数,就不需要重新编译客户端代码。您只需将客户端代码与新实现重新链接即可。
发布于 2012-03-14 19:07:47
不是以一种普遍有用的方式。它可能几乎适用于非常具体的用例。但是,支持这一项的维护负担很少值得付出努力。
要做到这一点,您需要将大量的复杂性降到您正在编写的“字段”类型中。这种复杂性不会得到很好的概括。这将是一个巨大的混乱,使用起来并不比自己编写访问器更容易。
如果编写这些访问器很费时,那么编写免费的助手函数就更容易了。这些自由函数是具体的和直接的,因为它们只做一件事。随着时间的推移,以这种方式收集行为的灵活性和可维护性要高得多,即使人们认为它更冗长。
这也有更好的封装。实际上,您正在将大量的实现细节抛到您的接口中,这些细节并不有趣,也不应该存在。
https://stackoverflow.com/questions/9708027
复制相似问题