簡體   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