我怎样才能摆脱C++;? 在C++中,你可以用两种方式来进行,即C风格的铸造或C++的铸造。Bjarne Stroustrup和其他C++专家都说,一个好的设计应该没有铸造。

我怎样才能摆脱C++;? 在C++中,你可以用两种方式来进行,即C风格的铸造或C++的铸造。Bjarne Stroustrup和其他C++专家都说,一个好的设计应该没有铸造。,c++,casting,C++,Casting,你能帮我重新设计下面的代码来摆脱演员阵容吗 void CProgressBar::SetPosition( int nPos ); //unable to change void CSaveDialog::UpdatePosition( double dProgress ) { double percentOfProgress = dProgress * 100; m_pProgressBar->SetPosition( static_cast<int>( pe

你能帮我重新设计下面的代码来摆脱演员阵容吗

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

void CSaveDialog::UpdatePosition( double dProgress )
{
   double percentOfProgress = dProgress * 100;
   m_pProgressBar->SetPosition( static_cast<int>( percentOfProgress ) );
}
void CProgressBar::SetPosition(int nPos)//无法更改
void csavedilog::UpdatePosition(双数据进程)
{
进度的双百分比=D进度*100;
m_pProgressBar->设置位置(静态施法(进度百分比));
}

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

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


此外,对于像这样的算术运算,您可能需要更加小心。在转换到
int
之前,您可能应该应用
celi
floor
。我不确定这是完全确定哪一种方式铸造到整数将轮。(即朝向+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 );
}

当人们说要避免强制转换时,他们通常指的是用户定义类型之间的转换。例如,您不应该经常需要从基类向下转换到派生类。如果您需要,您可能应该仔细查看您的类层次结构,看看它有什么问题。这同样适用于
重新解释演员阵容
。如果您经常使用它,在不相关的指针类型之间转换,这可能是一个迹象,表明您正在进行一些C风格的低级位黑客操作,这是可以而且应该避免的


在int和float或其他数字类型之间进行强制转换几乎是意料之中的事。

简单地将int传递给UpdatePosition怎么样?这是一个好问题,但示例并不代表Stroustrup的意思。如果您的示例是基类指针与派生类指针,那么转换对话将采取完全不同的路线。我支持这一点。只需使用floor(),因为毕竟,您所做的是从double向下转换为int,而floor()就是为此而构建的。它实际上是自动定义为floor的:4.9.1“浮点数类型的右值可以转换为整数类型的右值。转换会截断;也就是说,小数部分被丢弃。”就个人而言,我更喜欢没有地板。地板对于正值,也就是:)对于负值,它是ceil@Chris-演员扮演正数的floor(),负数的ceil()(去掉托德说的小数部分)。我个人只会在我想要浮点结果的时候使用floor,而不是在我想要int结果的时候。在这种情况下,似乎没有一个很好的方法来绕过演员阵容,但我确实发现boost::numeric_cast可以检查溢出:但随后您使用隐式行为—代码的读者甚至可能不会怀疑已执行了强制转换。仍然涉及到强制转换。您的编译器只是为您生成它。我认为[int运算符(int)(双d)]本质上定义了一些东西。@xtofl-他们可能不会怀疑有强制转换,但我认为他们不需要怀疑。数字从一种类型“流动”到另一种类型。由于隐式转换是函数签名的结果,因此它还使UpdatePosition的其余代码更干净、更易于阅读、更健壮。如果函数签名更改为float或double,这将产生正确的行为。除了有符号和无符号类型,我同意这样使用隐式类型转换通常不会造成混淆。将无符号类型与负值混合显然是另一回事,在这里我认为应该显式地放入强制类型转换以帮助清理问题,然后尝试通过不太多地混合类型来消除强制类型转换。我认为大多数编译器都会对此发出警告(当然,当您启用警告时)。