我有一个接受Material
类型的对象的构造函数:
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
然而,在使用此类的ctors (在同一个项目中的不同类别中)不止一次“用脚射击”之后我想要禁止构建直接SomeClass
个Vector
对象,而不是总是需要传递Material
。
有办法做到这一点吗?不知何故认为它与explicit
关键字有关。
答案 0 :(得分:2)
您声明Material(const Vector &v)
为explicit
;这可以防止从一个隐式转换到另一个。
这当然不是对SomeClass
的具体限制;它是对任何隐式转换实例的全局禁令。
答案 1 :(得分:1)
如果不干扰您从Material
透明地构建Vector
的能力,则无法执行此操作。
如果你使Material
的构造函数explicit
explicit Material( const Vector& v ) ;
然后你总是必须编写Material(v)
才能构造一个实例。这会阻止您使用SomeClass
意外地Vector
实例化,但它也会将所有评估为Vector
的表达式分解为预期Material
。
这是有道理的,因为通过不声明构造函数explicit
,你说“无论上下文是什么,Vector
和Material
一样好”。然后你不能向后半步说“哦,好吧,除了构建SomeClass
时”。
答案 2 :(得分:1)
制作Material
explicit
的构造函数:
explicit Material(const Vector& v) { ... }
或者,如果您不想这样做,作为一个黑客并const
- 作为牺牲的正确性,请从const
移除const Material& mat
。您将无法将临时对象传递给SomeClass
(或const
实例的构造函数,这可能是一个太大的牺牲)。但是,这使您无法执行您可能想要执行的SomeClass(Material(v))
。所以你只能接近你想要的东西,但我担心这不是完全可能的。