Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;|使用STL数据块和适配器设计实现堆栈_C++_Stack_Deque - Fatal编程技术网

C++ C++;|使用STL数据块和适配器设计实现堆栈

C++ C++;|使用STL数据块和适配器设计实现堆栈,c++,stack,deque,C++,Stack,Deque,准备考试并通过了这个我无法自信回答的问题。 假设我们需要使用STL deque和适配器设计实现一个堆栈,以下哪种方法是正确的:(只能有一个答案) 1。模板类堆栈:public deque{}; 2.模板类堆栈{private:deque*dptr;}; 3.模板类堆栈{protected:deque*dptr;}; 4.模板类堆栈{private:deque{};} 5.模板类堆栈:私有deque{}; 6.模板类堆栈{protected:deque d;}; 如有任何关于解决方案的提示,将不

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

1。模板类堆栈:public deque{};
2.模板类堆栈{private:deque*dptr;};
3.模板类堆栈{protected:deque*dptr;};
4.模板类堆栈{private:deque{};}
5.模板类堆栈:私有deque{};
6.模板类堆栈{protected:deque d;};

如有任何关于解决方案的提示,将不胜感激。谢谢

您永远不希望公开继承STL容器。它们根本不是为它而设计的,因为出于“随用随付”的原因,它们没有虚拟析构函数。其他形式的继承只是创建未命名的成员,在这种情况下,这些成员不会为您提供任何用途(它们对于使用C API等非常有用)。所以排除了1和5。因此,现在您可以拥有私有或受保护的成员。选择protected,因为这会为从您继承的其他类保留打开的选项。剩下3和6。现在,您希望使用值还是指针。这是一个STL容器,与原始指针不同,它可以在销毁时愉快地管理自己的资源。因此,6显然是赢家。

std::stack
正是这样一个适配器。请随意研究它的设计和实现——它的源代码包含在C++安装中。作为记录,
std::stack
与#6(受保护的成员)一起使用,但我看不出其他方法明显错误的任何原因。@IgorTandetnik我知道这一点。然而,我并没有被要求实现或使用它,我只是被问到在我需要的情况下,哪种选择是正确的方法。我会尽快检查源代码。@Flexo方法#6对于
std::stack
来说已经足够好了。你觉得这不可接受吗?以上问题的答案取决于你的导师的个人偏好。我有自己的偏好,但我可以看到一个合理的论点创建了一个堆栈,将一个deque改编成一个堆栈,每个deque都有自己的偏好,并且每个deque都有自己的反对意见。在你的课堂上,你可能会向你的导师/全班传达关于适配器设计(或一般的抽象)的经验法则,这个问题的答案将取决于这些信息。不,不必有正确的答案:你的类必须有正确的答案。@Flexo“
std::stack
没有受保护的内部成员”也有:“
Container c
底层容器(受保护的成员对象)”谢谢,简单明了。是的,6是正确的答案(我刚刚发现)。@Elia确实没有正确的答案。啊,是的,我明白了,谢谢你费尽心机解释如何消除每个案例,直到找到最合适的选择为止。
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; };