【问题标题】:Polymorphism and STL containers...are pointers unnecessary?多态性和 STL 容器……不需要指针吗?
【发布时间】:2017-11-17 02:07:40
【问题描述】:

我之前在软件工程堆栈交换中遇到了这个问题和答案。问题是,"Why are pointers not recommended when coding with c++?"。评分最高的答案提供了两点,第二点是感兴趣的。它指出:

C++ 中大多数指针的使用都是不必要的。

他的规范有些冗长,但作者在其中指出,“...现代 C++ 习语通常根本不需要指针。”。

首先想到的是 STL 容器中的多态性。在 C++ 中,如果不使用指针,这怎么可能?


经过一些研究,this 是我能够发现的全部内容(剧透:没有帮助)。

【问题讨论】:

  • 它说的是“大多数用途”,而不是“所有用途”。
  • std::vector<std::unique_ptr<Base>>...
  • @KerrekSB 这只是变相的指针。指针仍在使用中。
  • 你为什么说你链接到的第二个问题没有帮助?它似乎准确地回答了你的问题。
  • @BenjaminLindley 是的,但是使用 dynamic_case() 进行强制转换真的比使用指针更可取吗? Bjarne Stroustrup 甚至说:“最好避免强制转换。在大多数情况下,将它们的使用视为编程不佳的标志。”。必要时应避免强制转换似乎是常识。当然,在这种情况下没有必要。

标签: c++ stl polymorphism


【解决方案1】:

至少在 C++11 中是可能的,但在 IMO,这是个坏主意:

#include <vector>
#include <iostream>
#include <functional>

namespace
{
struct A
{
  virtual void operator()(void) { std::cout << "in A" << std::endl; }
};

struct B : public A
{
  virtual void operator()(void) { std::cout << "in B" << std::endl; }
};
}

int main(void)
{
  A a;
  B b;
  std::vector<std::reference_wrapper<A>> v;
  v.push_back(a);
  v.push_back(b);
  v[0]();
  v[1]();
  return 0;
}

我同意上面的 cmets。当您需要在容器中进行动态多态时,请使用智能指针。他们工作得很好。当指针被包裹在智能指针中时,指针还不错。 警告:在上述情况下,您必须确保 a 和 b 至少与该向量一样存在,否则引用将变为未定义(上面的代码是错误的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多