C++中是否有等价的Python属性?或者,使用getter和setters来做这个更好吗?C++相当于Python的属性
回答
是的,显式的getter和setter将是C++中最接近的构造。
标准C++没有任何属性。但是,如果你在微软平台上开发,你可以用自己的语言的扩展:
在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函数。
一个非常酷的解决方案 –
- 1. C#相当于Python中的属性定制/ JavaScript对象字面
- 2. 相当于C++的Python strtod
- 3. python struct.pack相当于C++
- 4. .net属性的Java相当于?
- 5. cv2相当于cv的属性
- 6. 相当于WPF中的keypreview属性
- 7. 相当于C#的ListView的Python吗?
- 8. C#/。NET相当于Python的检查
- 9. C++ 11相当于Python的all()函数
- 10. C++相当于Python的日志库
- 11. 相当于C#FileStream类的Python
- 12. Python的阵列管理C++相当于
- 13. 的Python struct.unpack相当于用C
- 14. 相当于C#
- 15. Tensorflow:在C++中相当于python tf.gradients
- 16. C#相当于OBJ-C的
- 17. Python相当于phpinfo()
- 18. python相当于sprintf
- 19. Python左()相当于?
- 20. python - strtotime相当于?
- 21. python相当于jstack?
- 22. C/C++相当于C#System.Net.Mail
- 23. 相当于Java Python的json.dumps
- 24. 相当于Python中的“do.call”
- 25. 相当于Python dis()的Lua?
- 26. python相当于java的OutputStream?
- 27. Python中的Mahout相当于
- 28. 的Python相当于指针
- 29. Python的枚举相当于
- 30. 的Python相当于猛砸$()
我在评论,因为我不确定它...我认为你可以在C++模拟模板类中模拟python的属性,用于限制实现(在编辑前哈哈糟糕的错字,对不起! )。您使用该模板强制类型,以便在错误的方式使用时会返回编译器错误。像这样的东西应该重新创建python的属性:) –