2011-08-18 96 views
2

C++中是否有等价的Python属性?或者,使用getter和setters来做这个更好吗?C++相当于Python的属性

+0

我在评论,因为我不确定它...我认为你可以在C++模拟模板类中模拟python的属性,用于限制实现(在编辑前哈哈糟糕的错字,对不起! )。您使用该模板强制类型,以便在错误的方式使用时会返回编译器错误。像这样的东西应该重新创建python的属性:) –

回答

8

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

9

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

+0

一个非常酷的解决方案 –