Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ 使用通用ADT_C++_Generics_Adt - Fatal编程技术网

C++ 使用通用ADT

C++ 使用通用ADT,c++,generics,adt,C++,Generics,Adt,我有一个设计问题。我被要求为一个特定的问题规划一个设计,其中我需要一些列表,还有一个队列(我需要自己创建,STL是不允许的)。为了使实现更高效,我考虑如下创建一个通用列表:创建一个包含指向“Data”指针的节点,一个空类。然后,我想创建一个列表或队列的任何类(最后一句语法正确吗?),我只会将其作为数据的子类。这是制作通用列表的唯一方法(我认为),因为我们不允许使用void*。 当我想在某个列表中使用某个类的某个方法时,问题就开始了。我不能这么做,因为“数据”不知道这个函数。在数据中创建一个虚拟函

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

关于列表和队列,也许您可以采用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...
};
模板
班级名单{
类节点{
公众:
节点(T*d)
{data.reset(新数据(d));}
T*getData()
{返回数据;}
节点*getSig()
{返回sig;}
私人:
std::自动ptr数据;
节点*sig;
};
列表()。。。
//还有很多事情。。。
};
您可以在此处找到更多信息:


希望这有帮助。

模板是C++中通用数据结构的规范方式,而不是子类。在这种情况下,谨防AutoPPTR。当涉及默认的复制构造函数和赋值运算符时,您是否确定这将正确执行。另外,重新实现标准库有什么意义?哦,我们也不允许使用模板。确实很严厉。但也许这是有原因的。摘自练习的常见问题:“Q:我可以使用模板吗?A:不,我会在代码审查会议上向你解释为什么,即使允许,它也不是设计的正确工具。”还有其他方法吗?@Alessandro,您应该仔细检查op中的问题。然后您就可以自己回答您的问题了。@user1330810,如果还有其他方法我不知道的话。泛型编程(模板)和多态性(继承+虚拟方法)是创建不依赖于给定特定类的集合的唯一方法。@Baltasarq这是我的观点,如果不允许它们使用标准库,我假设模板也不适用。