2011-12-09 63 views
0

我有接受Material類型的對象的構造:標記構造爲__explicitly__需要一個對象類型

SomeClass::SomeClass(const Material& mat) ; 

然而,Material允許施工由Vector

Material::Material(const Vector& v) ; 

因此,SomeClass可以允許通過建設Vector

SomeClass m(vec) ; // valid, since vec is constructed to a Material first, 
// then is passed to the SomeClass(Material) ctor 

然而,在「在腳下拍攝自己」不止一次這種類型的構建函數(在同一個項目在不同的班級!)我想禁止建設SomeClass通過Vector對象直接,而不是總是需要代替傳遞Material

有沒有辦法做到這一點?不知怎的,它認爲它與explicit關鍵字有關。

+0

¤您可以將'Material :: Material'構造函數標記爲'explicit'。在C++ 03中,你還必須確保'Vector'類中沒有'operator Material'。然而,在C++ 11中,你也可以將這樣的轉換運算符標記爲「顯式」(最好是恕我直言,以避免轉換運算符,而是通常通過命名函數提供轉換)。乾杯&hth。, –

回答

1

如果不干涉透明地構造MaterialVector的能力,則不能這樣做。

如果您Material的構造explicit

explicit Material(const Vector& v) ; 

,那麼你將永遠爲了構建一個實例來寫Material(v)。這會阻止您意外地用Vector實例化SomeClass,但它也會打破所有預計值爲Vector的表達式,其中Material是預期的。

這是有道理的,因爲通過不聲明構造函數explicit你說「無論上下文是什麼,一個Vector都和Material一樣好」。你不能後退半步,說:「噢,除非構建SomeClass」。

+0

是的!這是一個很棒的功能! – bobobobo

2

您聲明Material(const Vector &v)explicit;這可以防止從一個到另一個的隱式轉換。

這當然不是對SomeClass的具體限制;這是對任何隱式轉換實例的全球禁止。

1

使Materialexplicit構造:

explicit Material(const Vector& v) { ... } 

或者,如果你不想這樣做,作爲一個黑客位,並與const -correctness作爲祭品,從const Material& mat刪除const。您將無法將臨時對象傳遞給SomeClass的構造函數(或const實例,這可能會造成太大的犧牲)。但是,這可以防止你做SomeClass(Material(v))你可能想要做的。所以你只能接近你想要的東西,但我擔心這不是完全可能的。

+1

從構造函數param中刪除'const'實現了目標,但是不可取。 –

+0

@OliCharlesworth是的,這就是爲什麼我說這有點破解。我只是想讓他知道所有的選項,也許他不知道臨時文件只能作爲const引用傳遞,而不僅僅是引用。 –

相關問題