繁体   English   中英

如何摆脱C ++中的强制转换?

[英]How can I get away from casting in C++?

在C ++中,你可以使用几种方式,C风格的转换或C ++转换。 Bjarne Stroustrup和许多其他C ++专家说,一个好的设计应该没有铸造。

你可以帮我在这里重新设计下面的代码来摆脱演员阵容吗?

void CProgressBar::SetPosition( int nPos );  //unable to change

void CSaveDialog::UpdatePosition( double dProgress )
{
   double percentOfProgress = dProgress * 100;
   m_pProgressBar->SetPosition( static_cast<int>( percentOfProgress ) );
}

我可以修改UpdatePosition,但不能修改SetPosition。

我认为在算术中投射可以。 应该真正避免的转换类型是在您自己的类层次结构中上下(或跨越)。

另外,对于像这样的算术运算,你可能想要更加小心。 你应该在施放到int之前应用ceilfloor 我不确定它是否完全决定了转换为int的方式。 (即朝+ inf,朝-inf或朝零)

我不认为演员是必要的,有一个从double到int的隐式转换。 Comeau汇编了这个:

struct CProgressBar {
  void SetPosition( int nPos );  //unable to change
};

struct CSaveDialog {
  void UpdatePosition( double dProgress )
  {
     m_pProgressBar->SetPosition( dProgress * 100  );
  }

  CProgressBar* m_pProgressBar;
};

没有错误。 期望这种交叉数字转换,这就是为什么它们之间存在隐式转换。

如果需要,您不需要强制转换,双精度自动转换为int。 设置位置时,应将dProgress值加0.5,以使其正确舍入。 将double转换为int时,小数位被截断而不是舍入。

只需将percentOfProgress设为int。

void CProgressBar::SetPosition( int nPos );  //unable to change

void CSaveDialog::UpdatePosition( double dProgress )
{
   int percentOfProgress = dProgress * 100;
   m_pProgressBar->SetPosition( percentOfProgress );
}

当人们说要避免强制转换时,它们通常意味着用户定义的类型之间。 例如,您不应该经常需要从基类转发到派生类。 如果您需要,您应该仔细查看您的类层次结构,看看它有什么问题。 reinterpret_cast 如果你经常使用它,在不相关的指针类型之间进行转换,这可能表明你正在做一些C风格的低级别bit-hackery,这可以而且应该避免。

在int和float之间或其他数字类型之间进行转换是非常值得期待的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM