【问题标题】:syntax error in inheritance继承中的语法错误
【发布时间】:2016-03-10 02:07:27
【问题描述】:

我在尝试继承这些节点时遇到了一些问题。我在网上查看了很多示例,但无法弄清楚我做错了什么。

我的编译器给了我这些信息:

error: expected identifier before 'public'
error: expected '{' before 'public'
error: expected unqualified-id before 'public'

任何帮助将不胜感激:)

template <typename T>
class Node
{
    protected:
        Node<T>* next;
        Node<T>* prev;
        T* data;
    public:
        Node();
        ~Node();
        Node* getNext();
        Node* getPrev();
        void setNext(Node<T>*);
        void setPrev(Node<T>*);
        T* getData();
        void setData(T*);
};
template <typename T>
class HeadNode : public Node<T>
{
    public:
        HeadNode();
        ~HeadNode();
};
template <typename T>
class TailNode : public Node<T>
{
    public:
        TailNode(Node<T>*);
        ~TailNode();
};
template <typename T>
class InternalNode : public Node<T>
{
    public:
        InternalNode(Node<T>*, Node<T>*, T*);
        ~InternalNode();
};

template <typename T>
Node<T>::Node()
{
    next = 0;
    prev = 0;
    data = 0;
}
template <typename T>
Node<T>::~Node()
{
    //delete data;
}
template <typename T>
Node<T>* Node<T>::getNext()
{
    return next;
}
template <typename T>
Node<T>* Node<T>::getPrev()
{
    return prev;
}
template <typename T>
void Node<T>::setNext(Node<T>* n)
{
    next = n;
}
template <typename T>
void Node<T>::setPrev(Node<T>* n)
{
    prev = n;
}
template <typename T>
T* Node<T>::getData()
{
    return data;
}
template <typename T>
void Node<T>::setData(T* nData)
{
    delete data;
    data = nData;
}
template <typename T>
HeadNode<T>::HeadNode() : public Node<T>()
{
    next = new TailNode<T>(this);
}
template <typename T>
HeadNode<T>::~HeadNode()
{
}
template <typename T>
TailNode<T>::TailNode(Node<T>* p) : public Node<T>()
{
    prev = p;
}
template <typename T>
TailNode<T>::~TailNode()
{
}
template <typename T>
InternalNode<T>::InternalNode(Node<T>* n, Node<T>* p, T* nData):         public Node<T>()
{
    next = n;
    prev = p;
    data = nData;
}
template <typename T>
InternalNode<T>::~InternalNode()
{
    //delete data;
}

【问题讨论】:

  • 不能复现,投票关闭。
  • 哦,对不起,我没有复制整个源代码。撤回近距离投票。

标签: c++ class templates inheritance


【解决方案1】:

我不太擅长 C++,但这通过了编译器。

  • 从构造函数的初始化中移除 public
  • Node&lt;T&gt;::添加到子类要使用父类成员的位置
  • virtual添加到Node的析构函数中,这样子类的析构函数就会在删除时被调用

template <typename T>
class Node
{
    protected:
        Node<T>* next;
        Node<T>* prev;
        T* data;
    public:
        Node();
        virtual ~Node(); // add virtual
        Node* getNext();
        Node* getPrev();
        void setNext(Node<T>*);
        void setPrev(Node<T>*);
        T* getData();
        void setData(T*);
};
template <typename T>
class HeadNode : public Node<T>
{
    public:
        HeadNode();
        ~HeadNode();
};
template <typename T>
class TailNode : public Node<T>
{
    public:
        TailNode(Node<T>*);
        ~TailNode();
};
template <typename T>
class InternalNode : public Node<T>
{
    public:
        InternalNode(Node<T>*, Node<T>*, T*);
        ~InternalNode();
};

template <typename T>
Node<T>::Node()
{
    next = 0;
    prev = 0;
    data = 0;
}
template <typename T>
Node<T>::~Node()
{
    //delete data;
}
template <typename T>
Node<T>* Node<T>::getNext()
{
    return next;
}
template <typename T>
Node<T>* Node<T>::getPrev()
{
    return prev;
}
template <typename T>
void Node<T>::setNext(Node<T>* n)
{
    next = n;
}
template <typename T>
void Node<T>::setPrev(Node<T>* n)
{
    prev = n;
}
template <typename T>
T* Node<T>::getData()
{
    return data;
}
template <typename T>
void Node<T>::setData(T* nData)
{
    delete data;
    data = nData;
}
template <typename T>
HeadNode<T>::HeadNode() : Node<T>() // remove public
{
    Node<T>::next = new TailNode<T>(this); // add Node<T>::
}
template <typename T>
HeadNode<T>::~HeadNode()
{
}
template <typename T>
TailNode<T>::TailNode(Node<T>* p) :  Node<T>() // remove public
{
    Node<T>::prev = p; // add Node<T>::
}
template <typename T>
TailNode<T>::~TailNode()
{
}
template <typename T>
InternalNode<T>::InternalNode(Node<T>* n, Node<T>* p, T* nData): Node<T>() // remove public
{
    Node<T>::next = n; // add Node<T>::
    Node<T>::prev = p; // add Node<T>::
    Node<T>::data = nData; // add Node<T>::
}
template <typename T>
InternalNode<T>::~InternalNode()
{
    //delete data;
}

【讨论】:

  • 这很成功,还有关于析构函数的好建议:)
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 2021-03-15
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2015-09-27
  • 2015-06-09
相关资源
最近更新 更多