0

可以使用模板来默认实现 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 都可以是带有 operator() 的对象或 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;

它可以在派生类中被覆盖,而无需重新编译“客户端”代码。

4

2 回答 2

0

只要函数不是内联的,如果您重新实现这些函数,就不需要重新编译客户端代码。您只需要将客户端代码与新实现重新链接。

于 2012-03-14T19:01:10.160 回答
0

不是以一般有用的方式。它可能几乎适用于非常特定的用例。不过,支持这些单项服务的维护负担很少值得付出努力。

为此,您将大量复杂性推入您正在编写的“字段”类型。这种复杂性不能很好地概括。这将是一个巨大的混乱,使用起来并不比自己编写访问器更容易。

如果编写这些访问器很耗时,请编写免费的辅助函数以使其更容易。这些自由功能是具体而直接的,因为它们只做一件事。随着时间的推移,以这种方式收集行为更加灵活和可维护,即使它被认为有点冗长。

这也有更好的封装。确实,您将大量的实现细节倾倒到界面中,这些细节并不有趣,也不应该存在。

于 2012-03-14T19:07:47.643 回答