【问题标题】: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 问题,是的,但答案已更新。

标签: c++


【解决方案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::minstd::max(C 版本有很多问题,甚至都不好笑)。

【讨论】:

  • Re 宏:模板化代码、常量和内联!
【解决方案2】:

“大多数人”可能正在使用 C 风格的指针转换。最常见的是将指针转换为 void * 或整数。我经常这样做......

很多时候,这受到我在程序另一端的限制。就像将参数列表传递给 pthread_create 一样。

【讨论】:

  • 想了想,还是接受了这个,因为我觉得这更接近预期的意思。
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 2021-12-13
  • 2020-06-21
相关资源
最近更新 更多