我正在尝试在C ++中实现优先级队列(作为指针堆)。这可能是也可能不是糟糕的设计,但我创建了一个PriorityQueue类(它将包含整个堆)和堆中每个节点的另一个类Node。它看起来像这样:
class PriorityQueue {
public:
Node* root;
void insert(Node* n) {
n->ancestor = this;
root->insert(n);
}
}
class Node {
public:
PriorityQueue* ancestor;
Node* parent, left, right;
void insert(Node* n) { /* really long insert algorithm */ }
}
这些类互相引用,所以我需要某种原型。我尝试在开头添加class PriorityQueue;
和class Node;
,但是因无效使用不完整类型而出错。是否有可能按照我想要的方式做到这一点,或者我应该完全改变我的设计?
答案 0 :(得分:3)
让我们忘记术语 prototype ,并专注于前向声明和定义。
前向声明告诉编译器存在类(或结构或联合)以及类的名称。而已。这通常在头文件中用于解析参数和返回类型的指针和引用。
编译器需要一个完整的定义才能解析对结构中内容的访问。
答案 1 :(得分:3)
“无效使用不完整类型”的问题是因为您在insert
类中定义PriorityQueue
方法的方式。为了解决这个问题,您需要做的就是在声明Node
之后将实现移动到某个位置,如下所示:
class Node; // <<== I assume that you already have this
class PriorityQueue {
public:
Node* root;
// At this point, the definition of Node is incomplete.
// You can declare pointers or references of type Node,
// but you cannot call its member functions, because the compiler
// does not know what functions are available for the Node.
void insert(Node* n);
}; // <<== Do not forget semicolons
class Node {
public:
PriorityQueue* ancestor;
Node* parent, left, right;
void insert(Node* n);
}; // <<== Do not forget semicolons
// At this point, C++ compiler knows what functions the Node has,
// so it lets you make calls of member functions.
void PriorityQueue::insert(Node* n) {
n->ancestor = this;
root->insert(n);
}
void Node::insert(Node* n) {
/* really long insert algorithm */
}