2009-06-25 21 views
2

在C++中,你可以施展幾種方式,C風格的轉換或C++轉換。 Bjarne Stroustrup和其他一些C++專家說,一個好的設計應該沒有鑄造。如何才能擺脫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。

+2

簡單地將int傳遞給UpdatePosition怎麼樣? – 2009-06-25 13:00:50

+2

這是一個很好的問題,但這個例子並不代表Stroustrup的含義。如果你的例子是一個基類指針和派生類指針,那麼轉換對話將採用完全不同的路線。 – Kieveli 2009-06-25 13:09:05

回答

5

我認爲鑄造算術可以。真正應該避免的投射類型是上下(或跨越)你自己的類層次結構。

另外,對於像這樣的算術鑄造,你可能想要更加小心。在投射到int之前,您應該應用ceilfloor。我不確定它完全確定了將int轉換爲int的方式。 (即朝向+ INF,對-INF,或接近零)

+1

我會再來這個。只需使用floor(),因爲畢竟,你在做的是從double到int的向下轉換 - 而floor()就是爲此而創建的。 – 2009-06-25 13:08:39

3

我不認爲演員是必要的,有來自雙隱式轉換爲int。科莫彙編:

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

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

    CProgressBar* m_pProgressBar; 
}; 

沒有錯誤。這些交叉數字轉換是預期的,這就是爲什麼它們之間存在隱式轉換的原因。

1

如果需要,您不需要投射,雙打自動轉換爲int。 在設置位置以便正確舍入時,您應該將0.5添加到dProgress值。將double轉換爲int時,小數位將被截斷並且不會被舍入。

1

只需使percentOfProgress爲int即可。

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

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

當人們說要避免強制轉換時,它們通常是指用戶定義的類型之間的意思。例如,你不應該經常從基類向派生類降級。如果你需要的話,你應該仔細看看你的類層次結構,看看它有什麼問題。 reinterpret_cast也是如此。如果你經常使用它,爲了在不相關的指針類型之間進行轉換,這可能表示你正在做一些C風格的低級別的惡意代碼,這可能也應該避免。

int和float,或其他數字類型間的轉換,是非常可以預期的。