我在网上找到了一些关于如何在c ++中实现类似属性的功能的方法。似乎有一些合理的解决办法让它运作良好。
我的问题是,随着托管语言中属性的普遍存在,我是否应该花费精力和代码破坏(或其他)的可能性来实现我的代码中的属性?
假设我要开发一个供其他人使用的调用库,是否需要足够的属性来验证额外的代码?
答案 0 :(得分:9)
只有使用访问器功能才能从中获得什么? 在我看来,编码时你应该发挥语言的优势,而不是让它模仿另一种语言。所以我在这个问题上投了反对票。但是,如果您正在使用MANAGED C ++编写并且将使用此代码定期与C#进行交互,并且如果由于某种原因您希望使后端更易于被本机C#程序员使用,那么它可能是值得的。
答案 1 :(得分:4)
除非你在混合中添加反射(能够在运行时识别对象上存在哪些属性),否则属性只不过是getter和setter的语法糖。在这种情况下,也可以使用getter和setter。
使用反射的属性确实可以用于C ++程序。 Qt处理这个quite nicely。
答案 2 :(得分:4)
属性不是惯用的标准C ++ - 事实证明,没有单一的“类似属性”的库被广泛使用。在符合要求的C ++中正确实现它们的复杂性是重要的,而与直接调用访问器方法相比的好处很小,而且大多是风格。在我看来,这不值得打扰。
答案 3 :(得分:0)
如果操作正确,属性实际上可以防止代码破坏。它允许您更改下面属性的实现,而无需调用者更改其代码甚至担心它。
例如,假设你有一个带有套接字号的Socket类。实现为一个属性,只需要一个int并存储它。
但是你的老板说你不应该接受低于1024的套接字号。你的属性可以改为扫描,不接受该值。
不改变来电者代码。
编辑:对问题略有误解......我将属性视为正常的访问者函数。
答案 4 :(得分:0)
我曾尝试在C ++中实现类似于Matlab结构的东西,i。即可以添加命名字段的结构。在那之后,我成为了“不要与语言作斗争”原则的坚定信徒。
答案 5 :(得分:0)
使一种编程语言像另一种编程语言一样的努力通常是inner platform effect的特例。
我同意其他人 - 只需使用getter和setter。
如果你真的需要C ++中的属性,也许你已经将它们作为语言扩展。我认为Visual C ++确实 - 对于托管C ++几乎可以肯定,但也可能是非托管的。就个人而言,我使用它们的唯一原因是在托管C ++中符合.NET惯例。
除此之外,为此创建内部平台几乎肯定会导致比解决更多的问题。