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,并且他们的代码隐式地将其转换int为Bar,那么一旦looks_like_data成为一个Proxy它将不再隐含地转换为Bar你无论如何你已经破坏了他们的代码.
毕竟,如果你的类真的需要看起来像读/写属性的东西,你最好使用getter/setter函数.
标准 C++ 中没有属性。但是,如果您在 Microsoft 平台上进行开发,则可以使用他们的语言扩展:
http://msdn.microsoft.com/en-us/library/yhfk0thd.aspx