C++中与Python属性相当的内容

8
有没有C++中类似Python属性的东西?或者使用getter和setter来实现更好?

我在评论,因为我不确定它... 我认为你可以在一个C++模拟的模板类中模拟Python的属性,用于限制实现(lol在编辑之前有个糟糕的打字错误,抱歉!)。你使用那个模板来强制类型,这样如果用错了就会返回编译器错误。类似这样的东西应该可以重新创建Python的属性 :) - Samuele Mattiuzzo
3个回答

17
在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函数。


13

是的,在C++中,显式的getter和setter是最接近的构造。


7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接