[英]C++ Class Translation Design
我有A類和B類。並且我有兩個功能:
B FromAToB(A)
和A FromBToA(B)
問題是:我應該在哪個類中實現這些功能? 還是他們應該屬於另一類? 還是沒關系?
這些功能的放置位置取決於您的使用方式。
正如@FoggyDay所評論的那樣,沒有“一個正確答案”。 對我來說,簡單的功能可以完成所有工作。
您可以提供相互轉換運算符。 這將要求您向前聲明一個類,並將轉換運算符的實現推遲到另一類的實現之后。 例如:
#include <iostream>
struct Seconds;
struct Minutes
{
int value;
operator Seconds() const;
};
struct Seconds
{
int value;
operator Minutes() const
{
return Minutes{value / 60};
}
};
Minutes::operator Seconds() const
{
return Seconds{value * 60};
}
int main()
{
Minutes m{1};
Seconds s{60};
std::cout << static_cast<Seconds>(m).value << " "
<< static_cast<Minutes>(s).value;
return 0;
}
如果您不想隱式轉換(以避免錯誤),則可以將explicit
添加到運算符。
您只需在需要的每個類中將類型轉換運算符重新定義為您的類型即可。
例如,您可以執行以下操作,而不是在A類中調用函數(FromAToB等):
operator B() {
// Creating B b_object
return b_object;
}
然后在代碼中使用它
main() {
// Creating A a_object
B b_object = (B)a_object;
}
反之亦然。 因此,無需為此定義特殊方法,您可以簡單地使用類型強制轉換。
一些有用的鏈接: 重載類型轉換
因此...根據您的需求和意圖,有多種方法可以執行此操作。 如果每個函數都旨在執行從一種類型到另一種類型的破壞性轉換,那么我的建議是在要從其轉換的類型上創建一個運算符,並注意以某種方式破壞性。 盡管這是非常主觀的,但是您可以用另一種方式來做,我不認為有什么理由使其無效,只是大多數將A型轉換為B型的約定都將運算符置於A型(請參見toString之類的東西)在C#中)。
如果轉換是非破壞性的,即您要使用A並基於A制作B而又不損害A,那么有兩種非常好的方法來做到這一點:類型轉換運算符或構造函數。 我個人的建議是為每個采用其他類型的類型構造一個。 A::A(const &B)
是一個構造函數,它將使用B並從中獲得A。 這往往是最清楚的是發生了什么事情以及執行此轉換的潛在性能成本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.