【问题标题】:Queue of node using template使用模板的节点队列
【发布时间】:2021-08-22 01:22:53
【问题描述】:

我想使用模板创建一个节点队列,以按级别顺序显示 BST 树。 我创建了一个抽象类Queue 派生自这个类,称为QueueVector,并且我有我的tree 文件。 我不明白为什么当我创建节点队列时代码无法编译并说did not override any base class methods ,但是如果例如我将 node 更改为 int,它就完美了。

这是一行: Queue<Node>* q = new QueueVector<Node>; 我必须做什么才能创建节点队列

队列纯虚类

#pragma once
template <class T>
class Queue
{
public:
    virtual void clear() = 0;
    virtual void enqueue(int value) = 0;
    virtual int dequeue() = 0;
    virtual int front() = 0;
    virtual bool isEmpty() const = 0;
};

队列向量

template <class T>
class QueueVector : public Queue<T>
{
public:
    // constructor requires a starting size
    QueueVector(int max = 100);
    //QueueVector(const QueueVector&);

    // implement Queue protocol
    void clear() override;
    T dequeue() override;
    void enqueue(T value) override;
    T front() override;
    bool isEmpty() const override;
private:
    T* data;
    int capacity;
    int nextSlot;
    int firstUse;
};

template <class T>
class Tree
{
protected:
    //--------------------------------------------------------
    //  inner class Node
    //      a single Node from a binary tree
    //--------------------------------------------------------
    class Node
    {
    public:
        Node* left;
        Node* right;
        T value;
        Node(T val)
            : value(val), left(nullptr), right(nullptr) {}
        Node(T val, Node* l, Node* r)
            : value(val), left(l), right(r) {}
    };      //end of Node class

    Node* root;

public:
    Tree() { root = nullptr; }   // initialize tree
    bool isEmpty() const;
    void level() {  _level(root); } ;

private:
    void _level(Node* current);


template<class T>
inline void Tree<T>::_level(Node* current)
{
    Queue<Node>* q = new QueueVector<Node>;
    if (root == nullptr)
        return;
    q->enqueue(root);
    while (!q->isEmpty())
    {
        root = q->dequeue();//I can do this only if I store node
        if (root->left != nullptr)
            q->enqueue(root->left);
        if (root->right != nullptr)
            q->enqueue(root->right);
    }
}


【问题讨论】:

  • QueueVector 函数的主要和实现部分在哪里?最好在这里提供一个可编译的代码。
  • @prehistoricpenguin 主要不做任何导致问题的事情。我唯一想要的是我可以使用模板在我的节点函数队列中创建

标签: c++ pointers templates queue


【解决方案1】:

代码没有编译并说没有覆盖任何基类方法,但是如果我将节点更改为 int,它就完美了。

您不能重写纯虚方法更改其签名。

这是您的基类的 enqueue 方法:

    virtual void enqueue(int value) = 0;

虽然这是您的派生类:

    void enqueue(T value) override;

因为您标记了派生方法override(一件好事!),编译器试图找到void Vector::enqueue(T value),但因为它不存在而无法找到,除非Tint

由于您的基类无论如何都是模板,Vector::enqueueVector::dequeue 也应该使用 T 而不是 int

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 2018-11-12
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多