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

时间:2009-06-25 12:59:04

标签: c++ casting

在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。

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

我不认为强制转换是必要的,有一个从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;
};

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

只需将percentOfProgress设为int。

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

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

答案 4 :(得分:1)

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

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