“大多数人严重过度使用演员表”如何? [复制]
Posted
技术标签:
【中文标题】“大多数人严重过度使用演员表”如何? [复制]【英文标题】:How do "most people seriously overuse casts"? [duplicate] 【发布时间】:2013-12-06 16:12:40 【问题描述】:来自http://www.stroustrup.com/bs_faq.html#improve-my-C++-programs
问:改进我的 C++ 程序的最佳方法是什么?
A:我不能说。这取决于你如何使用它。大多数人都低估了抽象类和模板。相反,大多数人严重过度使用强制转换和宏。
我以前看到过关于宏的观点,但是当“大多数人”可以做其他事情时,他们会如何处理演员表呢?我在考虑指针转换。
【问题讨论】:
我最好的猜测是答案的两个部分齐头并进。人们在动态绑定方面低估了抽象类和模板。这会导致不必要的强制转换和宏的使用,在这种情况下,可以使用更好的 OO 设计(在这种情况下广泛使用多态性)来代替。 鉴于后面还有一个问题,“我们什么时候会有 C++ 标准?”,该文本很可能是 15 年前编写的。如果是这样,它可能没有更新(当然,许多常见问题解答最近更新了)。我真的不会担心“大多数人”做了什么。 @SteveJessop 问题,是的,但答案已更新。 【参考方案1】:当“大多数人”可以做其他事情时,他们会如何处理演员表?
你对指针的猜测是正确的。
考虑这段代码:
class some_base /* ... */ ;
class some_implementation: public some_base
void do_impl_stuff() /* ... */ ; // do_impl code is in specialization
错误的客户端代码:
void do_stuff(some_base* base)
if(some_implementation* p = dynamic_cast<some_implementation*>(base))
p->do_impl_stuff();
更好的选择:
class some_base
public:
virtual void do_impl_stuff() = 0;
virtual ~some_base() = default;
;
class some_implementation: public some_base
virtual void do_impl_stuff() override /* ... */ ;
void do_stuff(some_base* base)
base->do_impl_stuff();
第一个例子“滥用”了动态演员表。第二,是“做点别的”
编辑:Xephon 提出的观点也是有效的。
关于宏的过度使用,您在 C++ 中使用宏编写的大多数代码都可以(并且通常应该)使用模板化代码编写。
例如,看看 C #define min
/#define max
与 C++ std::min
和 std::max
(C 版本有很多问题,甚至都不好笑)。
【讨论】:
Re 宏:模板化代码、常量和内联!【参考方案2】:“大多数人”可能正在使用 C 风格的指针转换。最常见的是将指针转换为 void * 或整数。我经常这样做......
很多时候,这受到我在程序另一端的限制。就像将参数列表传递给 pthread_create 一样。
【讨论】:
想了想,还是接受了这个,因为我觉得这更接近预期的意思。以上是关于“大多数人严重过度使用演员表”如何? [复制]的主要内容,如果未能解决你的问题,请参考以下文章