我用C ++编写通用树编码,将每个节点表示为类变量TreeNode,每个节点的子节点(可以多于2个)表示为TreeNodeList,它是TreeNodes的链表。
这是我到目前为止所做的代码。
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename E>
class TreeNode {
private:
TreeNode* parent;
TreeNodeList* children; // This line gives C2143 Error, missing ';' before '*'
TreeNode* next;
E data;
public:
friend class TreeNodeList;
TreeNode() {}
TreeNode(E& data) {this->data = data;}
void setParent(TreeNode<E> &p) {parent = &p;}
void setData(E& data) { this->data = data; }
void setNext(TreeNode<E>& n) { next = &n; }
void addChild(TreeNode<E>& ch) {
children.add(ch);
ch.setParent(this);
}
TreeNode<E>* getChildren() const { return children; }
TreeNode<E>* getNext() const { return next; }
TreeNode<E>* getParent() const { return parent; }
const E& getData() const { return data; }
};
template <typename E>
class TreeNodeList {
private:
TreeNode* head;
TreeNode* last;
int size;
public:
TreeNodeList() : head(NULL), last(NULL) { head = last; size = 0; }
~TreeNodeList() {
while (!empty()) {
removeFront();
}
}
const bool empty() const {
return size = 0;
}
void removeFront() {
if (empty()) {
return; //can't remove empty list
}
else {
TreeNode<E>* old = head;
head = head->getNext();
delete old;
}
}
void add(TreeNode<E>& p) {
last->setNext(p);
last = last->getNext();
}
void print() {
TreeNode<E>* p = head;
while (p != NULL) {
cout << p->getData() << " ";
p = p->getNext();
}
}
};
我写的“TreeNodeList * children”的行不断给我C2143错误,其中显示缺少';'在'*'之前。我无法理解这一点,因为从其他类声明类类型变量看起来对我来说完全没问题。 从其他类声明类类型变量会产生这种错误吗?我被困在这里所以请帮助我解决问题。谢谢。
答案 0 :(得分:3)
你遇到一些问题:
首先:TreeNodeList
尚未宣布。你可以通过向前声明来解决这个问题:
class TreeNodeList;
template <typename E>
class TreeNode {
然而,这对你不利,因为:
第二:TreeNodeList
是一个模板。因此,您需要在使用模板参数时指定模板参数(并将其声明为模板)。您可以按如下方式修复children
的声明:
template<typename E>
class TreeNodeList;
template <typename E>
class TreeNode {
private:
TreeNode* parent;
TreeNodeList<E>* children;
请注意children
的声明与您的声明有何不同。