如果 C++ 中不存在 getter 和 setter,是否有自动生成它们的方法?

问题描述 投票:0回答:8

我对 Objective-C 很有经验,在 Objective-C 中你可以让编译器为你生成 getter 和 setter,如果它们不存在的话 (

@synthesize
)。

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

c++ oop setter getter accessor
8个回答
49
投票

C++ 核心指南建议不要使用琐碎的 getter 和 setter ,因为它们是不必要的,并且糟糕的面向对象设计的症状。因此,C++ 没有用于自动生成 getter 和 setter 的内置功能(尽管metaclasses,如果它们被包含在语言中,将使这成为可能)。 这与公认的软件工程原则有关告诉,不要问

特别是,通过 setter 改变状态通常是代码异味和糟糕的架构设计的标志。这个规则也有例外,纯粹是出于实用性。这很好,但例外情况很少,以至于它们不应该保证使用工具来自动生成 getter 和 setter。

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


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


9
投票

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


6
投票

你必须自己实施它们


4
投票

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


3
投票

使用访问器(特别容易以 c# vb.net 的形式)的优点是

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

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

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


2
投票

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


1
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.