Какой стиль броска лучше и почему? - PullRequest
2 голосов
/ 17 июня 2011

Представьте в C ++ два класса, один с именем derived, а другой с именем base, который является базовым классом первого. Если бы у меня был следующий код, который является предпочтительным:

base *b = init_value_here;
const derived *d = static_cast<derived *>(b);

или

base *b = init_value_here;
const derived *d = static_cast<const derived *>(b);

Другими словами, лучше ли исключать const в статическом приведении, когда это не требуется, поскольку компилятор может повышаться до константности, или лучше включить его, чтобы ослабить ограничения на b, чтобы он мог быть сделал const в будущем с большей готовностью?

Ответы [ 4 ]

8 голосов
/ 17 июня 2011

Ни один, если это возможно.Создайте свой класс так, чтобы базовый класс определял полностью полезный интерфейс и использовал только указатель базового класса.

Иногда, однако, вы застряли с унаследованным кодом, и в этом случае я бы явно сказал, что вы используете

РЕДАКТИРОВАТЬ: Я должен пояснить, что бывают случаи, когда возникает неполиморфная ситуация, и решение, использующее приведение, будет уместным.Вообще говоря, удручение может быть запахом дизайна, но это не всегда означает, что что-то определенно не так.

3 голосов
/ 17 июня 2011

Я стараюсь делать как можно меньше явных приведений, а все остальное неявным, если это возможно.

Так что я бы использовал первое (т.е. не включая const в актерском составе).

Но это только мое мнение.Вы также можете написать const там, так как это соответствует вашему вкусу.

3 голосов
/ 17 июня 2011

За одну строчку кода я бы об этом не беспокоился.Если вы в будущем измените значение b на const base*, то компилятор сообщит вам, какая строка является проблемной и что нужно изменить.Таким образом, преимущества в любом случае довольно минимальны - одно из них делает линию короче, а другое может сэкономить вам работу на несколько секунд в будущем, если вы уже выполняете ту же функцию, меняякод.Я бы добавил const, если бы мне пришло в голову это сделать, поскольку это немного уменьшает зависимость одной строки кода от деталей другой строки.Но я бы не стал менять его, если код уже написан.

Если вы разрабатываете API, вы бы поместили const там, где можете, потому что меняете APIможет быть больно.Я не думаю, что это потенциальное изменение в будущем болезненно.

3 голосов
/ 17 июня 2011

Ну, чтобы было ясно, они делают то же самое.

Теперь, если вы конвертировали из const base * в const derived *, только последний будет действительным, а для первого также потребуется const_cast. Если бы вы конвертировали из base * в derived *, действительным был бы только первый, так как в противном случае вам пришлось бы отбрасывать const -несс, только что добавленный вашим кастом.

Я бы предпочел избегать использования модификаторов const в приведении, если это явно не нужно. Другими словами, держите код настолько простым, насколько позволяет компилятор.

Конечно, вы должны использовать dynamic_cast<> вместо static_cast<> в этом сценарии, если b может быть экземпляром другого производного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...