在 C++ 中是否有等效的 Python 属性?或者使用 getter 和 setter 会更好吗?
最佳答案
在 C++ 中,您要么调用成员函数,要么访问数据成员。 Python 属性本质上是一种使用后者的语法来完成前者的方式,而在 C++ 中没有明智的方式来做到这一点。
理论上你可以用一个宏来破解一些东西,#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++ 等效于 Python 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105202/