【问题标题】:Combine template and inheritance结合模板和继承
【发布时间】:2013-06-02 19:06:24
【问题描述】:

我的任务是在 C++ 中以模板方式实现几种容器。 所有这些容器都应提供具有各种运算符重载的迭代器。 我对模板很陌生,事实上这将是我在这个主题上的第一个真正的项目。

这是我的问题: 在这种情况下,使用带有继承的模板是个好主意吗? 容器和迭代器都可以这样做吗? 如果是这样,我应该注意什么? 我不应该做什么? 对此主题的任何帮助将不胜感激。

【问题讨论】:

    标签: c++ templates inheritance iterator containers


    【解决方案1】:

    你的出发点是错误的。首先创建一些您认为可行的替代方案(有和没有继承),然后比较它们的优缺点。

    或者,如果你不能想出一个聚会,那就很好地结束你的问题。

    如果您不熟悉模板,我建议您从 typedef int VALTYPE; 开始,并使用它作为常规类来实现容器。测试一下,完成后可以把介绍替换成template,VALTYPE为参数。

    【讨论】:

      【解决方案2】:

      在开始重新发明轮子之前,您应该查看标准和 boost 中的容器(MultiindexPointer Container LibraryGraph,...)并尝试调整其中一个。

      【讨论】:

        【解决方案3】:

        您应该从编写更简单的容器开始:堆栈。这很简单,因为堆栈不需要交互器。

        我给你写了一个在 std::list 之上实现的堆栈的小例子,带有一些继承。

        尝试先编写自己的,但如果您愿意,可以将这个作为示例。

        #include <iostream>
        #include <list>
        
        /* Here mainly to demonstrate inheritance by providing a stack interface */
        template<typename T>
        class IStack
        {
        public:
        
          virtual void push(const T &i) = 0;
          virtual T& pop() = 0;
        };
        
        template<typename T>
        class Stack : public IStack<T>
        {
        private:
          std::list<T>  _internal;
        
        public:
          virtual void push(const T &i)
          {
            _internal.push_back(i);
          }
          virtual T& pop()
          {
            T& tmp = _internal.back();
            _internal.pop_back();
            return tmp;
          }
        };
        

        编辑:重命名基类,正如 James 指出的那样。

        【讨论】:

        • 你不应该毁了别人的作业。如果你至少解释了基类用于平衡复杂性的有用目的。
        • @BalogPal 我明确表示他应该先尝试自己编写,这只是一个示例,以防他想查看一些代码。显然,基类在这里是因为他要求继承,并且因为imo在设计容器时使用接口是有意义的。另外,如果其他人发现这个问题是因为他希望将模板和继承结合起来怎么办?
        • 显然,这里的基类不是Container,而是Stack。根据命名约定,它应该是Stack(基类)和ListBasedStack(派生类)。但是Stack 很简单;当你有迭代器时,乐趣就开始了。
        • 是的,应该命名为 IStack 之类的,我会编辑。确实堆栈很简单,这就是为什么我确实以它为例。
        • 要学习的重要的不是拥有基类的语法,而是评估它是好坏还是中性。
        【解决方案4】:

        继承和模板都不是目标,也都不好 或本身不好。问题是:你在尝试什么问题 解决?根据包含的类型进行区分 容器应该由模板制作:没有好的 如果通过继承处理返回类型的解决方案。 你如何管理容器、推进迭代器和 测试结束很好的继承候选者,但是 它仍然在某种程度上取决于设计。

        【讨论】:

        • 感谢您的回答。您能否详细说明我在使用继承时处理返回类型时将面临的问题?
        猜你喜欢
        • 2020-07-07
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多