【问题标题】:Can I reuse the return value of a function multiple times in a parent constructor?我可以在父构造函数中多次重用函数的返回值吗?
【发布时间】:2017-06-20 07:09:29
【问题描述】:

与这个问题类似,但差异很大,我不认为它是重复的:
C++ Calling a function before base-class initialization in the initialization list


我有这个构造函数:

EditorGrid::EditorGrid(int width, int height) :
    Grid(width  ,   //workingWidth
         height ,   //workingHeight
         (SettingsApp::getInstance(0)->iconSize + SettingsApp::getInstance(0)->iconSpace                                         )  ,   //pitchWidth
         (SettingsApp::getInstance(0)->iconSize + SettingsApp::getInstance(0)->iconSpace + SettingsApp::getInstance(0)->iconLabel)      //pitchHeight
         )
{
    //EditorGrid-specific setup
}

它有效,但是当我知道每次都会返回相同的东西时,多次调用SettingsApp::getInstance(0) 对我来说看起来很难看。我可以调用一次并在这种情况下重用该值吗?
(在这种情况下,指向SettingsApp 对象的指针)

(它的结构是这样的原因是因为Grid 的不同子代对pitchWidthpitchHeight 有不同的方程,我想保留在任何地方隐式使用相同对象而不实际传递它的单例想法。 )

【问题讨论】:

  • static inline int getDefaultPitchWidth()?这通常是处理重复代码的方式。
  • @StoryTeller inline 在代码中仍然有意义吗?
  • @EdgarRokyan - 定义“有意义”
  • @EdgarRokyan - 不是。作为链接规范非常需要它。这就是为什么在类定义中提供的每个函数也隐含inline

标签: c++ function caching constructor return-value


【解决方案1】:

创建一个(可能是私有的)ctor,将您只想计算一次的值作为参数并委托给它:

EditorGrid::EditorGrid(int width, int height, /*your_type*/& instance_0) :
    Grid(width, height,
         instance_0.iconSize + instance_0.iconSpace,
         instance_0.iconSize + instance_0.iconSpace + instance_0.iconLabel
{
    //EditorGrid-specific setup
}

EditorGrid::EditorGrid(int width, int height) :
    EditorGrid(width, height, *SettingsApp::getInstance(0))
{
}

【讨论】:

  • +1 这解决了眼前的问题,但是有没有办法在不添加私有 ctor 的情况下做到这一点?如果没有,我可能会这样做。
  • @AaronD 你为什么不想添加一个演员?这是惯用的方式,我认为它没有任何缺点。如果还有其他我不知道也想不到的方法。
  • 主要用于造型。这不是什么大不了的事。它看起来有点像void foo() {bar();}
  • @AaronD 不,它看起来像std::vector<string> split(const std::string& str, char split_char) { return split(str, [=](char c) { return c == split_char; });},其中您有多个重载都在做同样的事情,但使用不同的参数:您可以通过char(字符集合)指定拆分(例如std::string)或函子。因此,您在最通用的重载中实现逻辑,并让所有其他重载只调用那个。只是一个随机的例子,告诉你一点也不奇怪。
  • @PeteBecker 我为什么要讨厌它?它看起来正是我想要的......哦,等等......这是一个带有默认值的可选参数。我之前被这个问题困扰过:代码编译得很好,但它的行为很奇怪,因为未提供的可选参数的默认值与我的预期不同。所以我喜欢我的论点要么是必需的,要么是不可用的。所以是的,在考虑了一下之后,我想我拒绝它。 :-)
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2023-03-06
  • 2013-09-06
  • 2012-08-07
相关资源
最近更新 更多