2012-05-28 20 views
0

我有一个设计问题。我被要求为某个问题规划一个设计,在那里我需要一些列表,还有一个队列(我需要自己创建,STL是不允许的)。为了使实现更高效,我想创建一个通用列表,如下所示:创建一个包含指向'Data'的空指针的节点,一个空类。那么,我想创建一个列表或一个队列(是语法正确的最后一个句子?)的任何类,我只是将它作为数据的一个子类。这是制作通用列表(我认为)的唯一方法,因为我们不允许使用void *。 当我想在特定列表中使用特定类的某种方法时,问题就开始了。我不能这样做,因为'数据'不知道这个功能。在Data中创建虚拟函数是反逻辑和丑陋的,我们也不允许使用任何向下转换。 有没有办法使用通用ADT来解决这个问题?或者我必须创建具体的列表? 非常感谢! 编辑:我们也不允许使用模板。使用通用的ADT

+1

模板是非常建立在C++中,没有子类化通用数据结构的正规途径。 – leftaroundabout

回答

0

关于列表和队列,也许你可以采用由STL采取了同样的方法:只需要创建列表,然后堆栈,如列表中,你只能推,然后从弹出结束的适配器。

关于那些约束上,这似乎是严厉的,不要我想,其目的是供您使用的模板?

不是创建和空类,如果不包含任何方法不为你所有,使用模板如下面的例子:

template<typename T> 
class List { 

    class Node { 
    public: 
     Node(T* d) 
      { data.reset(new Data(d)); } 
     T * getData() 
      { return data; } 
     Node * getSig() 
      { return sig; } 
    private: 
     std::auto_ptr<T> data; 
     Node * sig; 
    }; 

    List()... 
// Lots of more things... 
}; 

你可以在这里找到更多的信息:

http://www.cplusplus.com/doc/tutorial/templates/

希望这会有所帮助。

+0

在这种情况下请注意auto_ptr。你确定当涉及到默认的拷贝构造函数和赋值操作符时它会正常运行。另外,重新实现标准库有什么意义? –

+0

哦,我们也不允许使用模板。确实是非常严厉的。但也许这是有原因的。从锻炼的常见问题解答摘自:“Q:我可以使用模板 ?答:不会,我会解释你在代码审查会议为什么,即使是允许的,它不会一直为设计的工具。”有没有其他方法? – nodwj

+0

@Alessandro,你应该仔细检查操作中的问题。然后你就可以自己回答你的问题。 – Baltasarq