C++相当于Python属性

Jim*_*ies 4 c++ python properties

在C++中是否有相当于Python的属性?或者使用getter和setter这样做会更好吗?

Die*_*lla 11

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


Ste*_*sop 10

在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) { }
};
Run Code Online (Sandbox Code Playgroud)

这几乎是,但不是很明智.使用隐式转换仍然会破坏源兼容性,因为有一条规则,即链中只能有一个用户定义的隐式转换,所以如果调用者在looks_like_data真正的时候编写了代码int,并且他们的代码隐式地将其转换intBar,那么一旦looks_like_data成为一个Proxy它将不再隐含地转换为Bar你无论如何你已经破坏了他们的代码.

毕竟,如果你的类真的需要看起来像读/写属性的东西,你最好使用getter/setter函数.


Tea*_*olf 6

标准 C++ 中没有属性。但是,如果您在 Microsoft 平台上进行开发,则可以使用他们的语言扩展:

http://msdn.microsoft.com/en-us/library/yhfk0thd.aspx