C++ 等效于 Python 属性

标签 c++ python properties

在 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/

相关文章:

python - 使用 statsmodels 和简单的二维线性回归出现错误 : Shapes not aligned,

java - 以编程方式加载 Spring 3.1 中的属性

c# - 如何获取已更改的复选框项目的对象名称?

c++ - 通用 Makefile 中所需的预构建规则

Python - 打开网站并发送 cookie

python - 从 matplotlib savefig 中删除空格

c# - .Net 属性网格。有没有办法让网格以不同的方式操作对象

c++ - std::aligned_alloc() 的重新分配等效项是什么?

c++ - 它在 C++11 标准中的什么地方指定了在翻译过程中何时可以评估 constexpr 函数?

c++ - 结构 vector ,我不知道该怎么做