【问题标题】:Is there a way to automatically generate getters and setters if they aren't present in C++?如果 C++ 中不存在 getter 和 setter,有没有办法自动生成它们?
【发布时间】:2011-08-02 13:16:29
【问题描述】:

我对 Objective-C 有经验,在 Objective-C 中,您可以让编译器为您生成 getter 和 setter(如果它们尚不存在) (@synthesize)。

有没有办法在 C++ 中做到这一点,还是我需要自己实现所有的 getter 和 setter?

【问题讨论】:

标签: c++ oop setter getter accessor


【解决方案1】:

The C++ Core Guidelines advise against using trivial getters and setters 因为它们是不必要的和a symptom of bad object-oriented design。因此,C++ 没有用于自动生成 getter 和 setter 的内置功能(尽管 metaclasses,如果它们被包含在语言中,将会使这成为可能)。 这与完善的软件工程原理tell, don’t ask有关。

特别是,通过 setter 改变状态通常是代码异味和糟糕的架构设计的标志。此规则有例外情况,purely out of practicality。这很好,但是例外很少,它们不应该保证工具可以自动生成 getter 和 setter。

事实上,您可以将其用作试金石:每当您发现自己希望使用工具自动生成此类样板时,请退后一步,重新考虑您的代码设计。


也就是说,有许多工具可以提供这些功能,而且从纯粹的实用角度来看,它们可能会被证明是有用的,尽管我没有亲自测试过它们:

【讨论】:

  • 你能给我推荐一本现代 c++ 指南文章/书吗?
  • @stijn 这是一般准则。因此,它是通用的,但这并不意味着它不能偶尔被打破。它实际上对容器很有意义。 C++标准库中有多少个容器有setter?对,零。他们有多少吸气剂?很少:基本上是sizeempty,也许还有capacity
  • 如果你给每个变量一个 getset 函数,这与仅仅公开你的变量并没有什么不同。
  • 当我听到这个术语时,我认为 getter 是一个简单地返回成员变量的函数,而 setter 是一个将值作为输入并将变量设置为该值的东西,可能添加了额外的检查。
  • 我讨厌这个答案。我不同意“尽可能少的 setter/getter 是最好的”。但有时它是有道理的。甚至答案中文章的作者也说:“我建议尽可能避免使用访问器。您会遇到访问器比任何其他解决方案都更干净的情况......”。假设我需要在一些游戏代码中检查对象的速度。游戏代码不属于该对象。我需要的是速度的吸气剂。不可变对象很棒,但性能不佳。 OP询问如何做某事。告诉他们怎么做。不要质疑他们的动机。
【解决方案2】:

不是编译器本身,而是像eclipse CDT这样的IDE实际上可以自动执行此操作(右键单击类>源>生成Getter和Setter...)。

【讨论】:

    【解决方案3】:

    你必须自己实现它们

    【讨论】:

      【解决方案4】:

      没有办法做到这一点。但是,如果您使用 Eclipse 等功能齐全的 IDE(不确定 Visual Studio 是否具有此功能),可以使用方便的选项让 IDE 为您生成 getter/setter 代码。

      【讨论】:

      • 如果你使用Eclipse CDT,你可以找到如何生成getter/setterhere的说明。
      【解决方案5】:

      使用访问器(c# vb.net 形式特别简单)对我来说的好处是

      1/ 可以在 setter 或 getter 中设置断点,否则您无法知道谁以及何时可以访问该成员。

      2/ 您可以控制设置什么值,以防需要测试溢出或其他错误设置。这是公共库中特别需要的,例如您的可视组件的属性编辑器。

      但这在您的私有内部类中并不完全需要。然后,我认为必须从您的对象的最终公共使用中设置对成员的受控访问的选择。

      【讨论】:

        【解决方案6】:

        不,编译器无法帮助您。例如,您可以创建一个 MACRO,或在构建步骤中生成一些代码..

        【讨论】:

        • 宏 = 难以或不可能调试
        • 打哈欠...如果某处使用了 MACRO 这个词,这是您的自动回复吗?
        【解决方案7】:

        我知道这已经很晚了,我正在使用 VS 2015,并且可以从 Visual Studio 市场安装一个插件/扩展,它可以方便您在此处生成 getter/setter 代码:https://marketplace.visualstudio.com/items?itemName=Gabsii.getter-setter-generator

        【讨论】:

          【解决方案8】:

          至少在 Visual Studio 2015 中,我找不到它。但是,如果您使用 Resharper,那么它可以在 .h 文件中生成 setter 和 getter

          【讨论】:

            猜你喜欢
            • 2011-11-05
            • 1970-01-01
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-23
            相关资源
            最近更新 更多