有没有C++中类似Python属性的东西?或者使用getter和setter来实现更好?
#define looks_like_data really_a_function()
但这样做并不美观,也不明智。使函数看起来像数据的唯一必要原因是为了与旧的调用代码兼容,这些代码过去曾将其视为数据。但在C++中,这样做无法给你二进制兼容性,而且即使对于源代码兼容性来说,由于宏会破坏已经在另一个上下文中使用名称 looks_like_data
的调用代码,因此这并不现实。所以这没有太多意义。struct Proxy {
Foo *foo;
Proxy(Foo *foo) : foo(foo) { }
operator int() const {
// getter code goes here,
// use (const Foo*)foo rather than foo
}
Proxy &operator=(int a) {
// setter code goes here
}
// optionally also implement boilerplate +=, -=, etc.
};
struct Foo {
// optionally
// friend class Proxy;
Proxy looks_like_data;
Foo() : looks_like_data(this) { }
};
这几乎是合理的,但并不完全如此。使用隐式转换仍然会破坏源代码的兼容性,因为有一个规则,即在链中只能有一个用户定义的隐式转换。因此,如果调用方在looks_like_data
真正是一个int
时编写了代码,并且他们的代码将该int
隐式转换为Bar
,那么一旦looks_like_data
成为Proxy
,它将不再隐式转换为Bar
,你仍然会破坏他们的代码。
因此,经过所有这些考虑,如果你的类确实需要像读/写属性那样的东西,最好使用getter/setter函数。
是的,在C++中,显式的getter和setter是最接近的构造。
标准的 C++ 中没有属性。不过如果你在 Microsoft 平台上进行开发,可以使用他们的语言扩展: