有没有办法在C++中不存在时自动生成getter和setter?

19 c++ oop getter setter accessor

我对Objective-C很有经验,在Objective-C中你可以让编译器为你生成getter和setter(如果它们还没有存在@synthesize).

有没有办法在C++中执行此操作,还是我需要自己实现所有getter和setter?

Kon*_*lph 31

我不知道这样的实用程序,它可能在惯用的现代C++中看不到多少用处:

现代C++指南认为你的班级不应该有getter和setter.事实上,制定者几乎完全无用,而吸气剂的用处非常有限.这与完善的软件工程原理有关,请不要问.

如果要更改类实例的状态,有两种方法可以执行此操作:

  1. 您对其执行一个改变其状态的操作.
  2. 您创建一个新实例.

通过setter变异状态通常是代码气味和糟糕的建筑设计的标志.

我承认这条规则有例外,纯粹是因为实用性.这很好,但例外情况很少,他们不保证自动生成getter和setter的工具.实际上,您可以将其用作试金石:当您发现自己希望使用自动生成此类样板的工具时,请退后一步并重新考虑您的设计.

  • 你能推荐我一本现代的c ++指南文章/书吗? (6认同)
  • 我讨厌这个答案.我并不反对"尽可能少的主持人/吸气者是最好的".但有时它是有道理的.甚至答案中文章的作者也说:"我建议尽量避免使用访问器.你会遇到访问者比任何其他解决方案更清洁的情况......".假设我需要在某些游戏代码中检查对象的速度.游戏性代码不属于对象.我需要的是速度的吸气剂.不可变对象很棒,但性能不高.OP询问如何做某事.告诉他们如何.不要质疑他们的动机. (6认同)
  • 如果你给每个变量一个`get`和`set`函数,那就和那些只是让你的变量公开不同. (4认同)
  • @stijn这是一般指导原则.因此,这是一般性的,但这并不意味着它不能偶尔被打破.它实际上对容器有很大的意义.C++标准库中有多少个容器有setter?对,零.他们有多少吸气剂?很少:基本上是`size`,`empty`,也许是'capacity`. (2认同)
  • 当我听到这个术语时,我认为 getter 是一个函数,它只返回一个成员变量,而 setter 则是将一个值作为输入并将变量设置为该值,并添加可能的额外检查。 (2认同)

asc*_*nio 8

不是编译器本身,而是像eclipse CDT这样的IDE 实际上可以自动执行此操作(右键单击class> Source> Generate Getters and Setters ...).


flu*_*mpb 6

你必须自己实现它们