0

タイプのオブジェクトを受け入れるコンストラクターがありますMaterial:

SomeClass::SomeClass( const Material& mat ) ;

ただし、次のようにMaterial構築できますVector

Material::Material( const Vector& v ) ;

したがって、SomeClassa による構築を許可できますVector

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

ただし、このタイプのctorを使用して (同じプロジェクト内の異なるクラスで)何度も「自分の足を撃った」後は、 byオブジェクトを直接構築することを禁止し、代わりに常に aを渡す必要があります。SomeClassVectorMaterial

これを行う方法はありますか?どういうわけかそれはexplicitキーワードに関係していると思います。

4

3 に答える 3

2

あなたは次のように宣言Material(const Vector &v)しますexplicit。これにより、一方から他方への暗黙的な変換が防止されます。

もちろん、これは に対する特定の制限ではありませんSomeClass。これは、暗黙的な変換のあらゆるインスタンスに対するグローバルな禁止です。

于 2011-12-09T02:57:52.707 に答える
1

Materialから透過的に構築する能力を妨げずにこれを行うことはできませんVector

Materialのコンストラクタを作るとexplicit

explicit Material( const Vector& v ) ;

その場合、インスタンスを構築するために常に記述する必要があります。これにより、誤って aMaterial(v)でインスタンス化するのを防ぐことができますが、aが期待される場所で a に評価されるすべての式が壊れてしまいます。SomeClassVectorVectorMaterial

コンストラクターを宣言しないことで、「コンテキストが何であれ、 a は aと同じくらい良いexplicit」と言っているので、これは理にかなっています。その後、半歩後退して「ああ、まあ、」を構築する場合を除いて、言うことはできません。VectorMaterialSomeClass

于 2011-12-09T02:57:14.607 に答える
1

のコンストラクタを作成しMaterial explicitます:

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

または、それをしたくない場合は、ちょっとしたハックconstとして、犠牲として -correctness を使用して、constfromを削除しconst Material& matます。一時オブジェクトをコンストラクターに渡すことはできませんSomeClass(またはconst、犠牲が大きすぎる可能性のあるインスタンス)。ただし、それでSomeClass(Material(v))はやりたいことができなくなります。そのため、自分が望むものに近づくことしかできませんが、完全に可能ではないことを恐れています.

于 2011-12-09T02:57:57.343 に答える