gpt4 book ai didi

C++ 等效于 Python 属性

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:17 28 4
gpt4 key购买 nike

在 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 ,他们的代码隐式转换了 intBar , 然后一次 looks_like_data变成 Proxy它将不再隐式转换为 Bar而且你还是破坏了他们的代码。

所以毕竟,如果您的类确实需要一些看起来像读/写属性的东西,您最好使用 getter/setter 函数。

关于C++ 等效于 Python 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7105202/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com