提供非const参考getter是有意义的吗
题
有时我需要揭露一些班级成员。例如在下面的示例中 class Mechanic
可能需要直接访问 Engine
零件。我读过很多次,由于有几个原因,都应通过突变器(登录器)方法访问所有字段。但是,在提供非const参考getter时是否有任何优势:
class Car
{
public:
Engine & engine()
{
return m_engine;
}
//as a consequence you will also need to provide const version
const Engine & engine() const
{
return m_engine;
}
private:
Engine m_engine;
}
仅仅使引擎组件公开:
class Car
{
public:
Engine engine;
}
您也可以替换 public
和 protected
如果您不喜欢这个示例。在现实生活中,您在Java中有类似的东西 System.in
或者 System.out
. 。看起来,要完全符合某些人所说的话,您需要执行诸如 System.getInstance().getOut().println("hello world")
. 。在这种情况下,除了很多官僚机构外,我没有任何好处。
解决方案 5
我找到了合理的观点来提供这样的胜利。它使您的软件集成更加容易(例如,当您想将接口转换为另一种语言并绑定ABI时)。
其他提示
当您返回的价值实际上在堆上时,它们可能会很有用。
template<class T> class Singleton
{
private:
static T* m_pSingleton;
public:
T& getSingleton() { assert(m_pSingleton); return(*m_pSingleton); };
}; // eo class Singleton
明确的getters和setter 能够 过分酿酒;这取决于您的情况。
具有Getter和Setter函数的主要原因是,它将您的班级客户端与将来的实施中的潜在更改隔离(例如,考虑如果您决定生成一个会发生什么情况 Engine
对象按需(而不是使用成员变量),或决定将其隐藏在智能指针或其他容器之后)。
如果您的班级很简单(例如,接近 荚)并且不太可能改变,那么不得不实施getters和setter,这可能是不值得的。
但是,要回答您的问题, 非con Getter可能没有多大意义。您的Getter原型应该是 Engine & engine() const
;否则您将无法打电话 const
Car
对象。
提供Getter的一个优点是,如果您决定更改Getter的工作方式,那么使用此类的代码不必重新编译。但是,如果您有一个公共场所,然后决定制作一个getter,则应重新编译所有代码。除此之外,我看不到任何严重的实际理由将您的变量私有化。但是,请注意,这一切都必须在且仅当您必须为外部用户提供对引擎的引用的方法时。如果可以设计该软件,以便根本需要消除此软件,那就更好了。
当我碰巧最近接受教育时,Getters and Setters的设计闻到了不良设计的气味。但是,如果您愿意的话,提供了以获取和设置的功能 m_engine
(由您定义)而不是仅仅暴露它(您没有干预)意味着您有一个未来更改的插件点。
对我来说,这里很有意义:
image(i,j) = 234;
与其考虑暴露班级的私人成员,还可以按照这些课程的调用方法的方式思考。我读了一篇有趣的Java文章, 为什么Getter和Setter方法是邪恶的, ,它适用于C ++与Java一样多。
是的,这是有道理的 - 可维护性,验证和一致性。
您可能需要在将来更改班级的许多方面,提供登录器可以帮助最大程度地减少客户端代码的破坏。
您可以在此处输入所需的所有验证逻辑,以确保引擎是有效的指针,不处于无法使用的状态等。
最后,您的代码将保持一致:您不必打开标题才能知道会员的可见性 - 您一直都知道。这对模板也很有用。
在这种情况下,您宁愿需要一个 Car.fix(const Mechanic&)
然后将引擎赋予 Mechanic
, , 说: Engine.fix(const Mechanic&)
, ,我想 Engine
将被修改。
使用类的最初想法是将数据与其访问器功能联系在一起。如果您仅返回内部数据的设置器或Getter,则意味着您的数据与访问器功能没有捆绑在一起:您的类未完成。
你只想 公开一类发出的新数据. 。说 Car.get_exhaust()
和 Car
当您提出要求时,没有排气,只会产生它。 )
或者 Fire Riefle.fire()
而无法访问 Riefle::Trigger
这样的机械师将确定: Trigger.fix_by(Mechanic)
然后 fix_by
会打电话 Mechanic.add_working_hour(0.5)
. 。 XD