0

我有一个接受类型对象的构造函数Material

SomeClass::SomeClass( const Material& mat ) ;

但是,Material允许通过 a 构造Vector

Material::Material( const Vector& v ) ;

因此,SomeClass可以允许由 a 构造Vector

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

但是,在使用这种类型的ctors(在同一个项目的不同类中!)多次“射击自己的脚”之后,我想禁止直接构造对象,而是总是要求传递 a 。SomeClassVectorMaterial

有没有办法做到这一点?不知何故认为它与explicit关键字有关。

4

3 回答 3

2

你声明Material(const Vector &v)explicit;这可以防止从一个到另一个的隐式转换。

当然,这不是对SomeClass;的具体限制。这是对任何隐式转换实例的全球禁令。

于 2011-12-09T02:57:52.707 回答
1

如果不干扰MaterialVector.

如果你 makeMaterial的构造函数explicit

explicit Material( const Vector& v ) ;

那么您将始终必须编写Material(v)才能构造实例。这将防止您意外地实例化SomeClassa Vector,但它也会破坏所有计算结果为 a 的Vector表达式Material

这是有道理的,因为通过不声明构造函数explicit,您是在说“无论上下文如何, aVector都和 a 一样好”。Material然后你不能向后退半步说“哦,好吧,除非在构造一个SomeClass”时。

于 2011-12-09T02:57:14.607 回答
1

使构造函数Material explicit

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

或者,如果您不想这样做,作为一种 hack 并以const-correctness 作为牺牲,请删除constfrom const Material& mat。您将无法将临时对象传递给构造函数SomeClass(或const可能牺牲太大的实例)。但是,这使您无法做SomeClass(Material(v))您可能想做的事情。所以你只能接近你想要的,但恐怕不是完全可能的。

于 2011-12-09T02:57:57.343 回答