在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。
答案 0 :(得分:5)
我认为算术运算可以。应该真正避免的转换类型是在您自己的类层次结构中上下(或跨越)。
另外,对于像这样的算术运算,你可能想要更加小心。您应该在投射到ceil
之前应用floor
或int
。我不确定它是否完全决定了转换为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之间或其他数字类型之间进行转换是非常值得期待的。