Пометить конструктор как __exclearly__, требующий тип объекта - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть конструктор, который принимает объект типа 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.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2011

Вы объявляете Material(const Vector &v) как explicit;это предотвращает неявное преобразование из одного в другое.

Это, конечно, не является конкретным ограничением для SomeClass;это глобальный запрет на любой случай неявного преобразования.

1 голос
/ 09 декабря 2011

Создайте конструктор из Material explicit:

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

Или, если вы не хотите этого делать, как хак и с const -корректностью в качестве жертвы, удалите const из const Material& mat. Вы не сможете передать временный объект конструктору для SomeClass (или для экземпляра const, который может быть слишком большой жертвой). Однако это удерживает вас от выполнения SomeClass(Material(v)), что вы, возможно, захотите сделать. Так что вы можете приблизиться только к тому, что хотите, но я боюсь, что это не совсем возможно.

1 голос
/ 09 декабря 2011

Вы не можете сделать это, не мешая вашей способности прозрачно построить Material из Vector.

Если вы сделаете конструктор Material explicit

explicit Material( const Vector& v ) ;

тогда вам всегда нужно будет написать Material(v), чтобы создать экземпляр.Это предотвратит случайное создание экземпляра SomeClass с Vector, но также нарушит все выражения, которые оцениваются в Vector, где ожидается Material.

Это имеет смысл, посколькуне объявляя конструктор explicit, вы говорите: "Vector так же хорош, как Material, независимо от контекста".Затем вы не можете сделать полшага назад и сказать «о, хорошо, кроме случаев, когда вы строите SomeClass».

...