C++ 显式地将构造函数标记为需要对象类型的
我有一个构造函数,它接受类型为C++ 显式地将构造函数标记为需要对象类型的,c++,explicit,construction,C++,Explicit,Construction,我有一个构造函数,它接受类型为Material的对象: SomeClass::SomeClass( const Material& mat ) ; 但是,材质允许通过向量进行构造: Material::Material( const Vector& v ) ; SomeClass m( vec ) ; // valid, since vec is constructed to a Material first, // then is passed to the SomeCla
Material
的对象:
SomeClass::SomeClass( const Material& mat ) ;
但是,材质
允许通过向量
进行构造:
Material::Material( const Vector& v ) ;
SomeClass m( vec ) ; // valid, since vec is constructed to a Material first,
// then is passed to the SomeClass(Material) ctor
因此,SomeClass
可以允许通过向量进行构造:
Material::Material( const Vector& v ) ;
SomeClass m( vec ) ; // valid, since vec is constructed to a Material first,
// then is passed to the SomeClass(Material) ctor
然而,在多次使用这种类型的CTOR(在同一项目中的不同类中!)对自己进行“射击”之后,我想禁止直接通过向量
对象构建某个类
,而总是要求传递材质
有办法做到这一点吗?不知何故,你认为这与显式关键字有关。如果不影响你从向量透明地构建材料的能力,你就无法做到这一点
如果您使材料
的构造函数显式
explicit Material( const Vector& v ) ;
然后,为了构造一个实例,您将始终必须编写Material(v)
。这将防止您意外地用向量
实例化SomeClass
,但它也会破坏所有计算为向量
的表达式,其中需要材质
这是有意义的,因为不声明构造函数explicit
就是说“无论上下文如何,向量
与材质
一样好”。然后,你不能后退半步说“哦,好吧,除非在构建SomeClass
”时,你不能不干扰你从向量透明地构建材料的能力
如果您使材料
的构造函数显式
explicit Material( const Vector& v ) ;
然后,为了构造一个实例,您将始终必须编写Material(v)
。这将防止您意外地用向量
实例化SomeClass
,但它也会破坏所有计算为向量
的表达式,其中需要材质
这是有意义的,因为不声明构造函数explicit
就是说“无论上下文如何,向量
与材质
一样好”。然后,你不能后退半步说“哦,好吧,除非在构造SomeClass
”时,你声明材料(const Vector&v)
是明确的;这可以防止从一个隐式转换到另一个
当然,这不是对SomeClass
的具体限制;这是对任何隐式转换实例的全球禁令。您将材质(const Vector&v)
声明为显式;这可以防止从一个隐式转换到另一个
当然,这不是对SomeClass
的具体限制;这是对任何隐式转换实例的全局禁止。使材质的构造函数显式:
explicit Material(const Vector& v) { ... }
或者,如果您不想这样做,作为一个黑客,并以const
-正确性作为牺牲,请从const Material&mat
中删除const
。您将无法将临时对象传递给SomeClass
的构造函数(或const
实例,这可能是一个太大的牺牲)。但是,这会阻止您执行您可能希望执行的SomeClass(Material(v))
。因此,你只能接近你想要的,但我担心这不完全可能。使材料的构造函数显式:
explicit Material(const Vector& v) { ... }
或者,如果您不想这样做,作为一个黑客,并以const
-正确性作为牺牲,请从const Material&mat
中删除const
。您将无法将临时对象传递给SomeClass
的构造函数(或const
实例,这可能是一个太大的牺牲)。但是,这会阻止您执行您可能希望执行的SomeClass(Material(v))
。因此,您只能接近您想要的,但我担心这不完全可能。您可以将Material::Material
构造函数标记为explicit
。在C++03中,还必须确保向量
类中没有操作符材质
。但是,使用C++11还可以将此类转换运算符标记为显式(最好是避免使用转换运算符,而通常通过命名函数提供转换)。干杯,·您可以将Material::Material
构造函数标记为explicit
。在C++03中,还必须确保向量
类中没有操作符材质
。但是,使用C++11还可以将此类转换运算符标记为显式(最好是避免使用转换运算符,而通常通过命名函数提供转换)。干杯,从构造函数参数中删除常量
可以达到目的,但这是不可取的。@OliCharlesworth是的,这就是为什么我说这有点像黑客的原因。我只是想让他知道所有的选项,也许他不知道临时变量只能作为const
引用传递,而不仅仅是引用。从构造函数参数中删除const
可以达到目标,但不可取。@OliCharlesworth是的,这就是为什么我说这有点麻烦。我只是想让他知道所有选项,也许他不知道临时变量只能作为const
引用传递,而不仅仅是引用。是的!!这是一个伟大的功能!对这是一个伟大的功能!