【问题标题】:C++ | Implementing a Stack using STL deque and Adapter design [closed]C++ |使用 STL 双端队列和适配器设计实现堆栈 [关闭]
【发布时间】:2016-05-01 02:44:25
【问题描述】:

准备考试并通过了这个我无法自信回答的问题。 假设我们需要使用 STL deque 和 Adapter 设计来实现 Stack,以下哪种方法是正确的方法:(只能有一个答案)

1. template <typename T> class stack: public deque<T> {};
2. template <typename T> class stack {private: deque<T>* dptr; };
3. template <typename T> class stack {protected: deque<T>* dptr; };
4. template <typename T> class stack {private: deque<T> {};}
5. template <typename T> class stack: private deque<T> {};
6. template <typename T> class stack {protected: deque<T> d; };

任何解决方案的提示将不胜感激。谢谢。

【问题讨论】:

  • std::stack 正是这样一个适配器。随意研究它的设计和实现——它的源代码包含在您的 C++ 安装中。作为记录,std::stack 与 #6(受保护成员)一起使用,但我看不出其他方法明显错误的任何原因。
  • @IgorTandetnik 我知道这一点。但是,我没有被要求实施或使用它,我只是被问到如果我需要,哪些选项是正确的方法。我会尽快检查源代码。
  • @Flexo 方法 #6 对于std::stack 来说已经足够好了。怎么样让你觉得不可接受?
  • 上述问题的答案将取决于您的导师的个人喜好。我有自己的偏好,但我可以看到一个合理的论点创建了一个堆栈,该堆栈将一个双端队列与它们中的每一个一起调整为堆栈,并反对它们中的每一个。在您的课堂上,您可能与您的讲师/课堂上关于适配器设计(或一般抽象)的经验法则进行了交流,并且该问题的答案将取决于该信息。不,不一定有正确的答案:必须有一个正确的答案适合你的班级
  • @Flexo "std::stack 没有受保护的内部成员" 也有。 en.cppreference.com/w/cpp/container/stack : "Container c 底层容器(受保护的成员对象)"

标签: c++ stack deque


【解决方案1】:

您永远不想从 STL 容器公开继承。它们根本不是为此而设计的,因为出于“按需付费”的原因,它们没有虚拟析构函数。其他形式的继承只是创建未命名的成员,在这种情况下不会为您服务(它们对于使用 C API etc 很有用)。这样就排除了 1 和 5。所以现在您可以拥有私有成员或受保护成员。选择受保护,因为这会为从您继承的其他类保留选项。所以剩下 3 和 6。现在你想要按值还是指针。这是一个 STL 容器,它可以在被破坏时愉快地管理自己的资源,这与原始指针不同。所以 6 是明显的赢家。

【讨论】:

  • 谢谢,简单明了。是的,6 是正确答案(我刚刚发现)。
  • @Elia 确实没有正确答案。
  • 啊,是的,我明白了,感谢您费尽心思解释如何消除每个案例,直到留下最合适的选项。
猜你喜欢
  • 2021-07-08
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2015-02-16
  • 2021-10-06
  • 2013-05-28
相关资源
最近更新 更多